はじめに
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);
}
}