ノードが contenteditable div に挿入されるたびにトリガーされる eventHandler があります。この eventHandler は、新しく挿入されdiv node
た をに置き換えp node
ます。
問題は、置換後にカーソルを配置することです。基本的に、カーソルは適切に配置されていません。つまり、新しく作成された p ノードに配置されるはずのカーソルが消えてしまいます。奇妙なことに、コンテンツの編集可能な div にはまだフォーカスがあり、window.selection
オブジェクトをダンプすると範囲が正しく設定されていることがわかります。
この問題を回避できる唯一の方法は、setTimeout を使用したダーティ フィックスを使用することでした。
Q. setTimeout を指定して placeCursor() を呼び出すのに、setTimeout を指定しないと呼び出せないのはなぜですか?
関連コード:
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);
}
}
詳細については、この投稿を参照してください