介绍
在编辑 contenteditable DOM 对象的内容时,不同的浏览器有不同的行为。例如,Firefox 18.0 在某些情况下会创建一个新段落 ( <p>
) 或换行符<br/>
,而 Chrome 24 会创建一个<div>
.
为了解决这个问题,我正在监听DOMNodeInserted
事件并用 p 标签替换新插入的节点。
问题
问题是将插入符号放置到位。我已经阅读了 SO 中关于同一主题的大量帖子,但所提供的答案都没有奏效,至少在 Chrome 24 中是这样。
代码
obj.addEventListener("DOMNodeInserted", onNodeInsert, false);
function onNodeInsert(e) {
var range = document.createRange(),
sel = window.getSelection(),
newNode = e.target,
tagName = newNode.tagName.toLowerCase(),
lnbrNode = document.createElement('br'),
pNode = document.createElement('p');
if (tagName === 'div' && newNode.getAttribute("id") === null) {
// First we remove the event listener so that it doesn't get triggered again
this.removeEventListener('DOMNodeInserted', onNodeInsert, false);
// Creates a p node and removes the div
newNode.parentNode.replaceChild(pNode, newNode);
pNode.appendChild(lnbrNode);
// Places the caret where it belongs
range.setStart(pNode, 0);
sel.removeAllRanges();
sel.addRange(range);
//We can restore the event listener now
this.addEventListener("DOMNodeInserted", onNodeInsert, false);
}
}