在可编辑的contentEditable
元素上按回车键时,每个浏览器处理生成的代码方式都不同:Firefox插入BR标签,Chrome插入DIV标签,而Internet Explorer插入P标签。
我曾经拼命寻找至少在所有浏览器中使用BR或P的解决方案,最常见的答案是:
插入BR标签:
$("#editableElement").on("keypress", function(e){
if (e.which == 13) {
if (window.getSelection) {
var selection = window.getSelection(),
range = selection.getRangeAt(0),
br = document.createElement("br");
range.deleteContents();
range.insertNode(br);
range.setStartAfter(br);
range.setEndAfter(br);
selection.removeAllRanges();
selection.addRange(range);
return false;
}
}
});
但是这样做行不通,因为浏览器似乎不知道如何在 <br>
后设置插入符号,这意味着以下内容没有任何实用价值(特别是如果你在文本末尾放置插入符号时按下回车键):
range.setStartAfter(br);
range.setEndAfter(br);
有些人会说:使用双重 <br><br>
,但这样在文本节点中按回车键会导致两个换行符。
其他人会说,始终在 contentEditable 的末尾添加额外的 <br>
,但是如果你有一个 <div contenteditable><p>text here</p></div>
并将光标放置在文本末尾然后按回车键,则会出现错误的行为。
所以我想也许我们可以使用 P 代替 BR,常见的答案是:
插入 P 标签:
document.execCommand('formatBlock', false, 'p');
但是这也不能始终奏效。
正如您所见,所有这些解决方案都有些缺陷。是否有另一种解决方案可以解决这个问题?