スクリプトは非常に長いので、すべてを貼り付けるのではなく、説明しようと思います。編集:もう少し表示する必要があるようです。
毎秒数回、UL を新しいコンテンツで更新します (updateDomTree を呼び出します)。DOM ツリーは、CKEditor 内の要素を表します。
function updateDomTree(editor) {
var selection = editor.getSelection();
var jqElements = $(document.createElement('div'));
var editorData = editor.document.getBody();
var kids = editorData.getChildren();
// Gather LI to represent Editor content DOM element hierarchy
for (var i = 0, len = kids.count(); i < len; i++) {
jqElements.append(HandleNode(kids.getItem(i), selectedElement, editor));
}
var domUL = document.createElement('ul');
domUL.id = "dom";
var jqUL = $(domUL).append(liElements);
$(document.getElementById('dom')).replaceWith(jqUL);
}
// This is a recursive function, but it has no other issues than the memory leak
// If I comment out the click event, it works fine.
// The **obj** variable is why I don't use the "delegation" method.
function HandleNode(obj, selection, editor) {
// do other stuff, handle recursion etc.
liElement.on('click', function(e) {
editor.getSelection().selectElement( obj );
editor.focus();
editor.getSelection().scrollIntoView();
e.stopPropagation();
});
return liElement;
}
現在IE9では、メモリ使用量が急速に上昇し始めています。クリック ハンドラをコメント アウトすると、メモリ リークはなくなりますが、機能がなくなります。この問題をどのように回避しますか?
別の説明: #dom は DOM 構造の UL 視覚的表現であり、要素を参照するにはクリック イベントが必要です。そのため、クリック イベント ハンドラーの作成中にオブジェクト参照が必要です。基礎となる DOM が変更されると、UL 表現はその変更を反映する必要があります。これが、迅速な更新の理由です。