96

.on()ページの読み込み後に作成される div のイベントをバインドするために使用しています。click、mouseenter ... では問題なく動作しますが、クラス MyClass の新しい div がいつ追加されたかを知る必要があります。私はこれを探しています:

$('#MyContainer').on({

  wascreated: function () { DoSomething($(this)); }

}, '.MyClass');

どうすればいいですか?プラグインなしでアプリ全体を書くことができたので、そのままにしておきたいです。

ありがとう。

4

6 に答える 6

111

以前は、jQuery のdomManipメソッドにフックしてすべての jQuery dom 操作をキャッチし、挿入された要素などを確認することができましたが、jQuery チームは jQuery 3.0+ でそれをシャットダウンしました。内部domManipメソッドがコア jQuery コードの外部で使用できなくなるようにしました。

以前は次のようなことができたので、突然変異イベントも廃止されました。

$(document).on('DOMNodeInserted', function(e) {
    if ( $(e.target).hasClass('MyClass') ) {
       //element with .MyClass was inserted.
    }
});

これは避けるべきであり、今日では、このように機能する Mutation Observers を代わりに使用する必要があります。

var observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
        console.log(mutation)
        if (mutation.addedNodes && mutation.addedNodes.length > 0) {
            // element added to DOM
            var hasClass = [].some.call(mutation.addedNodes, function(el) {
                return el.classList.contains('MyClass')
            });
            if (hasClass) {
                // element has class `MyClass`
                console.log('element ".MyClass" added');
            }
        }
    });
});

var config = {
    attributes: true,
    childList: true,
    characterData: true
};

observer.observe(document.body, config);
于 2012-05-02T14:17:58.017 に答える
55

これがまさにそれを行う私のプラグインです - jquery.initialize

.each使用法は関数を使用する場合と同じですが、.initialize要素に関数を使用する場合との違い.eachは、追加のコードなしで将来追加される要素も初期化することです-AJAXまたはその他で追加するかどうかに関係なく.

Initialize の構文は .each 関数とまったく同じです

$(".some-element").initialize( function(){
    $(this).css("color", "blue");
});

ただし、.some-element セレクターに一致する新しい要素がページに表示されると、即座に初期化されます。新しいアイテムが追加される方法は重要ではありません。コールバックなどを気にする必要はありません。

$("<div/>").addClass('some-element').appendTo("body"); //new element will have blue color!

プラグインはに基づいていますMutationObserver

于 2015-02-04T01:03:37.297 に答える
25

この投稿と他のいくつかの投稿を確認した後、要素のクラスが挿入されたときに検出し、それらの要素に対処できるようにするために、それぞれの最良の点を単純なものにまとめようとしました。

function onElementInserted(containerSelector, elementSelector, callback) {

    var onMutationsObserved = function(mutations) {
        mutations.forEach(function(mutation) {
            if (mutation.addedNodes.length) {
                var elements = $(mutation.addedNodes).find(elementSelector);
                for (var i = 0, len = elements.length; i < len; i++) {
                    callback(elements[i]);
                }
            }
        });
    };

    var target = $(containerSelector)[0];
    var config = { childList: true, subtree: true };
    var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
    var observer = new MutationObserver(onMutationsObserved);    
    observer.observe(target, config);

}

onElementInserted('body', '.myTargetElement', function(element) {
    console.log(element);
});

私にとって重要なことは、これにより、a) ターゲット要素が「addedNodes」内の任意の深さに存在し、b) 最初に挿入されたときにのみ要素を処理できることです (ドキュメント設定全体を検索したり、「処理済み」を無視したりする必要はありません)。フラグ)。

于 2016-07-22T03:08:58.957 に答える
17

3年間の経験の後、これが「DOMに追加された特定のクラスの要素」を聞く方法です。次のように、jQueryhtml()関数にフックを追加するだけです。

function Start() {

   var OldHtml = window.jQuery.fn.html;

   window.jQuery.fn.html = function () {

     var EnhancedHtml = OldHtml.apply(this, arguments);

     if (arguments.length && EnhancedHtml.find('.MyClass').length) {

         var TheElementAdded = EnhancedHtml.find('.MyClass'); //there it is
     }

     return EnhancedHtml;
   }
}

$(Start);

これは、jQuery を使用している場合に機能します。また、ブラウザー固有のイベントに依存していないため、ブラウザー間のDOMNodeInserted互換性がありません。また、同じ実装を追加しました.prepend()

全体として、これは私にとって魅力のように機能し、うまくいけばあなたにとっても.

于 2015-05-20T19:57:00.580 に答える
6

突然変異イベントを使用できます

http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-mutationevents

編集

MDN から: https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events

非推奨 この機能は Web から削除されました。一部のブラウザーはまだサポートしている可能性がありますが、廃止される過程にあります。古いプロジェクトや新しいプロジェクトでは使用しないでください。それを使用しているページまたは Web アプリは、いつでも壊れる可能性があります。

突然変異オブザーバーは、DOM4 の突然変異イベントの代替として提案されています。それらは Firefox 14 と Chrome 18 に含まれる予定です。

https://developer.mozilla.org/en/docs/Web/API/MutationObserver

MutationObserverDOM の変更に対応する方法を開発者に提供します。これは、DOM3 Events 仕様で定義されている Mutation Events の代わりとして設計されています。

使用例

次の例はhttp://hacks.mozilla.org/2012/05/dom-mutationobserver-reacting-to-dom-changes-without-killing-browser-performance/からの引用です。

// select the target node
var target = document.querySelector('#some-id');

// create an observer instance
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });    
});

// 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();
于 2012-05-02T14:15:51.803 に答える