2013-10-26 4 views
5

これは何らかの方法で処理できることがわかっていますが、今のところこれは本当に苦労しています。私はスクリプトを書いていて、DOM操作が完了したときにいくつかの特定の機能を起動したい。他のスクリプトを変更/追加/削除することはできません(フレームワークを使用してページに挿入される可能性があります)。このページでは、コンテンツをロード/変更するためにajaxリクエスト(jQueryでは実装されていません)を使用しています。今度は、すべてのDOMの変更が完了したときにイベントがトリガーされるようにします。私の現在のアプローチは、すべてのDOMSubtreeModifiedイベントで関数を起動することです。このすべてのDOMの変更でjavascriptイベントが発生する「完了」

$(document).bind('DOMSubtreeModified', doSomeStuff); 

のようなものしかし、このアプローチの欠点は、通話中に10の要素は、各要素のdoSomeStuffが解雇されたAJAX負荷にしましょう。これは、10番目の要素が読み込まれた後にのみ発射するように制限できますか? $(document).ready()イベントをリセットするような何か?したがって、DOMが準備されるたびに(アフター・コンテンツをロードした後)$(document).ready()が呼び出されます。

+0

DOMSubtreeModifiedは推奨されていません。http://stackoverflow.com/questions/6659662/why-is-the-domsubtreemodified-event-deprecated-in-dom-level-3こちらの代わりにhttp:// updatesを使用することをおすすめします。 .html5rocks.com/2012/02/DOM-changes-with-Mutation-Observers – Bernhard

+0

@Bernhard DOMSubtreeModifiedはクロムでも動作しますが、突然、突然変異の観察者が文書の準備ができたら教えてくれますか? – whizzzkid

答えて

1

jQueryには、完成したAJAX呼び出しごとに所定の関数を呼び出すメソッドajaxCompleteがあります。詳細hereを参照してください。

jQueryを使用することをお勧めします(これはオプションではない場合があります)。この関数のソースコードを分析して、そこでどのように処理されているかを確認してください。

+0

私はこれを実装するのに失敗しました。これは、jQueryのajaxリクエストだけを聞きますか?...関心のあるページはjQueryのajax関数を使用していないためです。 – whizzzkid

+0

ドキュメントに「今、jQueryメソッドを使用してAjaxリクエストを作成する」と書かれていますので、jQueryリクエストでのみ動作すると思います。ソースを詳しく見てみると、助けになるかもしれません:) –

+0

:(万能なソリューション? – whizzzkid

2

Mutation Observerを使用すると、変更を監視することができ、イベントが発生するとドキュメントが変更されます。

MutationObserver = window.MutationObserver || window.WebKitMutationObserver; 

var observer = new MutationObserver(function(mutations, observer) { 
    // Add the actions to be done here if a changes on DOM happened 
    console.log(mutations, observer); 

}); 

// Register the element root you want to look for changes 
observer.observe(document, { 
    subtree: true, 
    attributes: true 
}); 
+0

完全に有効ですが、私はすべてのDOM変更時に起動したくありません。どのようにdomの変更を完了するだけで発砲するのですか?... jQueryのajaxCompleteのようなものですが、jQueryはありません...すべてのコンテンツの読み込み中... – whizzzkid

+0

@whizzkidドームの変更がすべて完了したというイベントはありません。この返答は、単一の変更が完了した/起こった場合にのみ表示されます。したがって、不明な数の変更を完了するためにリスナーが必要な場合は、カウンタなどを作成し、オブザーバのコールバック内で0になるまでカウンタを減らす必要があります。 0の場合、変更が完了したことがわかります。しかし、良いことではなく、より良いコールバック指向アーキテクチャがより合理的です。 – Bernhard

+0

は、$(document).ready()のようなものを再準備して再起動すると再起動できますか? – whizzzkid

0

私は少し遅れて相手にだけど、あなたはdoSomeStuff機能をデバウンスすることができますように聞こえます。あなたがUnderscore.jsへの依存を導入することに反対しないなら、それは素晴らしいdebounce機能を持っています。

関連する問題