【发布时间】:2011-08-26 18:27:54
【问题描述】:
我对 SAFARI/CHROME 上的 contenteditable 换行有疑问。当我在 contentEditable <div> 上按“返回”时,他们没有创建 <br>(如 Firefox),而是创建了一个新的 <div>:
<div>Something</div>
<div>Something</div>
看起来像(在 contentEditable DIV 上):
Something
Something
但是在清理之后(删除<div>),我得到了这个:
SomethingSomething
在 Firefox 中,contenteditable 是:
Something
<br>
Something
而且消毒后看起来一样:
Something
Something
有什么解决方案可以跨浏览器“规范化”这个吗?
我在Make a <br> instead of <div></div> by pressing Enter on a contenteditable找到了这个代码
$(function(){
$("#editable")
// make sure br is always the lastChild of contenteditable
.live("keyup mouseup", function(){
if (!this.lastChild || this.lastChild.nodeName.toLowerCase() != "br") {
this.appendChild(document.createChild("br"));
}
})
// use br instead of div div
.live("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);
range.collapse(false);
selection.removeAllRanges();
selection.addRange(range);
return false;
}
}
});
});
这可行,但(在 SAFARI 和 CHROME 中)我必须按两次“返回”键才能换行...
有什么想法吗?
编辑:除了“确保<br> 元素始终是lastChild ...如何解决这个问题?
编辑 2: 我在控制台上收到此错误:Uncaught TypeError: Object #<HTMLDocument> has no method 'createChild'
编辑 3: 好的,我将 document.createChild("br"); 更改为 document.createElement("br"); 并且我认为我可以在 FF/Safari/Chrome 中使用它...全部返回 <br> 换行。 ..
现在的问题是,当我在有序或无序列表中时,我需要在没有<br>...的情况下换行...
编辑4:如果有人对上次编辑的解决方案感兴趣:Avoid createElement function if it's inside a <LI> element (contentEditable)
【问题讨论】:
-
你的消毒方法是什么样的?
-
@mdmullinax 它只是删除了所有... 我正在使用 github.com/gbirke/Sanitize.js 问题是 Safari/Chrome,当我按下回车键时,它们只是创建一个新的 DIV 而不是制作
像 Firefox也许你可以使用 $("div:empty").replaceWith("
");有没有发现对两个返回键的bug有用的东西?我遇到了同样的问题,我似乎唯一能做的就是破解(添加一个空文本并选择它,所以如果你继续写它会自动消失),我会在那个线程上发帖以防万一。它并不完美,但它确实有效。Firefox 现在有一种混合方法:它将
s 包装在s 中。这使它的行为类似于 Chrome,我猜是因为 react 完全删除了s,包括
s.
标签: jquery contenteditable sanitization