爲了解決你的問題,始終保持BR元素爲您CONTENTEDITABLE div的最後一個元素。這將確保注入br元素時的可預測行爲與注入div元素的瀏覽器默認值。你可以在keyup和mouseup上檢查lastChild以確保它是br元素。假設你有一個這樣的文件:
<div id="editable" contenteditable="true"></div>
您可以使用下面的JavaScript(W/jQuery的1.4+),以保持br元素作爲最後一個元素,並注入br元素,而不是DIV DIV:
$(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;
}
}
});
});
在Apple OS X w/Google Chrome 7,Mozilla Firefox 3.6,Apple Safari 5上測試)。嘗試使用ierange以使其在Windows Internet Explorer中正常工作。
無需'range.collapse(假);':你已經放置在開始和範圍的結束。 IERange的另一種選擇是我自己的Rangy(http://code.google.com/p/rangy),它的概念相似但更完全實現(並積極維護)。 – 2011-05-18 09:09:44