防止 contenteditable 在 ENTER 上添加 <div> - Chrome

IT技术 javascript jquery google-chrome html contenteditable
2021-02-06 05:21:06

我有一个contenteditable元素,每当我输入一些东西并点击ENTER它时,它就会创建一个新元素并将<div>新行文本放在那里。我有点不喜欢这个。

是否有可能防止这种情况发生或至少只是将其替换为<br>?

这是演示http://jsfiddle.net/jDvau/

注意:这在 Firefox 中不是问题。

6个回答

试试这个:

$('div[contenteditable]').keydown(function(e) {
    // trap the return key being pressed
    if (e.keyCode === 13) {
        // insert 2 br tags (if only one br tag is inserted the cursor won't go to the next line)
        document.execCommand('insertHTML', false, '<br/>');
        // prevent the default behaviour of return key pressed
        return false;
    }
});

单击此处进行演示

但我发现这里有点不同。将光标放在空白行上(在“键入一些内容”的顶部),然后按 Enter。光标现在就在“类型”之前,而不是在新的空行上。
2021-03-14 05:21:06
回答是不能接受的。解决方案是只有一个 <br />
2021-03-17 05:21:06
这返回 <br> 和 <div>
2021-03-26 05:21:06
这在 IE11 中不起作用,因为它不支持 insertHTML。看下面的答案!
2021-03-27 05:21:06
如果您将光标放在字符之间,例如。'Ty[cursor]pe some stuff' 然后按回车键,你得到的 1 行太多了。
2021-04-07 05:21:06

将样式添加display:inline-block;contenteditable,它不会生成divpspan在 Chrome 中自动生成

在 IE11 中,这将额外增加<p></p> :(
2021-03-13 05:21:06
它会创建另一个非常烦人的Chrome 错误(多么糟糕的浏览器)
2021-03-16 05:21:06
这是一个很好的解决方案。 *[contenteditable="true"]{display: inline-block;}
2021-03-25 05:21:06
不再适用于 Chrome 版本 63.0.3239.84
2021-04-03 05:21:06
喜欢它,简单但有效
2021-04-06 05:21:06

您只需更改 CSS 即可做到这一点:

div{
    background: skyblue;
    padding:10px;
    display: inline-block;
}

pre{
    white-space: pre-wrap;
    background: #EEE;
}

http://jsfiddle.net/ayiem999/HW43Q/

哇...这解决了 Chrome,但让 Firefox 在进入时开始添加 div,默认情况下它不会。
2021-03-13 05:21:06
使用 inline-block 时出现问题,执行 execCommand("insertHTML", xxx) 插入任何内容,插入元素末尾会添加“<br>”,在 Chrome33 中测试。
2021-03-14 05:21:06
这是一个非常好的解决方案,它非常干净和清晰,不会插入任何内容,甚至包括 br。尤其是这个没有js的解决方案。
2021-03-17 05:21:06
@ReinoutvanKempen 3 个月前就开始使用 flex 了。我想这个 hack 行不通
2021-03-27 05:21:06
不错的发现。遗憾的是,这不适用于 position: absolute 元素或具有 display: flex 的父元素的直接子元素。记住这一点,你可以破解它来工作。只要确保它不是 flex 元素的直接子元素。如果你需要它 position: absolute 给它一个额外的父级。
2021-04-06 05:21:06

这适用于所有主要浏览器(Chrome、Firefox、Safari、Edge)

document.addEventListener('keydown', event => {
  if (event.key === 'Enter') {
    document.execCommand('insertLineBreak')
    event.preventDefault()
  }
})
<div class="element" contenteditable="true">Sample text</div>
<p class="element" contenteditable="true">Sample text</p>

有一个不便之处。完成编辑后,元素<br>内部可能包含结尾但是如果需要,您可以添加代码来减少它。

检查此答案以删除尾随<br> https://stackoverflow.com/a/61237737/670839

有没有搞错?真正对我有用的唯一解决方案怎么会在页面下方这么远?非常感谢。
2021-03-24 05:21:06
execCommand 已弃用!不再推荐此功能。尽管某些浏览器可能仍然支持它,但它可能已经从相关的 Web 标准中删除了。
2021-04-01 05:21:06
这现在适用于所有主要浏览器,并且可能会继续工作,因为没有人从网络上删除过东西。
2021-04-01 05:21:06
你刚刚度过了我的一天,这需要几个小时才能弄清楚 - 谢谢!
2021-04-05 05:21:06
document.execCommand('defaultParagraphSeparator', false, 'p');

它覆盖了默认行为,改为使用段落。

在 chrome 上,输入的默认行为是:

<div>
    <br>
</div>

有了那个命令,它会是

<p>
    <br>
</p>

现在它更线性了,只要<br>你需要它就很容易拥有

谢谢!解释总是有帮助的
2021-03-23 05:21:06
这在 Firefox 上不起作用(我仅在 chrome 和 Firefox 中进行了测试)
2021-03-23 05:21:06
FireFox 已修复为现在尊重 defaultParagraphSeparator。恕我直言,这使这个答案成为最好的答案,因为它使所有浏览器现在都一致并符合规范。如果您不希望 P 标签与内容可编辑中的前一个文本块有一个“间距”,那么您可以使用 css 来修改它。
2021-03-26 05:21:06
@jpaugh np,我进一步编辑了我的答案,以便更好地解释。
2021-04-06 05:21:06
当您按下 Enter 键时,您将拥有跨浏览器的 p 和 br,而不是 div 和 br。试试看。
2021-04-07 05:21:06