我有一个 eventHandler,每次将节点插入到 contenteditable div 时都会触发它。此 eventHandler 将新插入的替换div node
为p node
.
问题是在替换后放置光标。基本上光标没有正确放置,也就是说,光标在预期放置在新创建的 p 节点中时消失了。奇怪的是,内容可编辑 div 仍然具有焦点,并且转储window.selection
对象显示正确设置的范围。
我可以解决此问题的唯一方法是使用 setTimeout 进行脏修复。
问:为什么使用 setTimeout 调用 placeCursor() 但不使用它时它会起作用?
相关代码:
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
var placeCursor = function () {
range.setStart(pNode, 0);
sel.removeAllRanges();
sel.addRange(range);
}
//placeCursor(); // DOES NOT WORK (cursor disappears)
setTimeout(placeCursor,1); // WORKS
//We can restore the event listener now
this.addEventListener("DOMNodeInserted", onNodeInsert, false);
}
}
有关更多上下文,请参阅此帖子