私のページで次のjQueryコードを使用しましたが、すべてがchromeで正常に動作しますが、Firefoxでそれぞれのページを開くと、応答しないスクリプトエラーが発生します。
DOM3仕様に従って、ミューテーションイベントは廃止されました。しかし、もし誰かがここで私を手伝ってくれるなら、私は義務があります。
jQuery('#term').on("DOMSubtreeModified",function(){
$("#term > .click-slide").click(function(){
$(this).siblings().slideToggle();
});
});
それぞれのHTMLは次のとおりです。
<div class="btn-slide" id="term">
<div class="click-slide">
<button>Search Terms </button>
</div>
<div class="btn-box">
<label><span>Novena</span></label>
</div>
</div>
Firefoxでは、.slideToggle()
の呼び出しがDOMSubtreeModified
イベントをトリガーしているように見えますが、これはChromeでは発生していません。つまり、基本的にFirefoxでは、何かが最初にクリックハンドラーをバインドするイベントをトリガーします。この時点ですべてが良好です。次にクリックに進むと、slideToggle
が期待どおりに発生します。ただし、それによってDOMSubtreeModifiedイベントが発生し、2回登録されたため、2つのクリックイベントハンドラーが両方ともslideToggle
を実行することになります。次にクリックするのは、無限ループが発生したときです。基本的に、複数のクリックイベントはDOMSubtreeModified
をトリガーし続けます。これにより、より多くのslideToggles
を発生させるより多くのDOMSubtreeModified
を発生させるクリックハンドラーが登録されます。これを修正するには、jQueryの.one
を使用して、ページにそのDOMSubtreeModified
ハンドラーを1回だけ起動するように指示し、このループを防ぐことができます。それが適切な解決策でない場合は、.click
ハンドラーが複数回バインドされないようにするために、他の方法を考え出す必要があります。
jQuery('#term').one("DOMSubtreeModified",function(){ //Notice this is using .one and not .on
これをチェックしてください JSFiddle -.one
を使用していますが、.onを使用すると、ChromeではなくFirefoxで問題が発生することを確認できました。
質問はMutation-eventsに関するものであり、以下に投稿されたものはMutationObserver を使用しているため、これは適切な回答ではない可能性があります=しかし、これは便利だと思う人もいるので、まだ投稿しています。
これは、一部のノードがDOMに追加されている場合に備えてDOMSubtreeModifiedイベントに使用した代替案です。
var target = $( "#term" )[0];
// Create an observer instance
var observer = new MutationObserver(function( mutations ) {
mutations.forEach(function( mutation ) {
var newNodes = mutation.addedNodes; // DOM NodeList
if( newNodes !== null ) { // If there are new nodes added
//alert('something has been changed');
}
});
});
// Configuration of the observer:
var config = {
attributes: true,
childList: true,
characterData: true
};
// Pass in the target node, as well as the observer options
observer.observe(target, config);
// Later, you can stop observing
// observer.disconnect();