0

ページ内のすべての要素にクラスを挿入するクロム プラグインを開発しています。しかし、facebook や twitter などのページには動的に読み込まれるコンテンツがあるため、このコードを使用して、このコンテンツがいつ読み込まれるかを確認します。

document.addEventListener('DOMNodeInserted', function() {
    console.log('fatto');
}, true);

問題は、この方法では、ノードが挿入されるたびにスクリプトが起動されることです。したがって、何らかの制限を追加したいと思います。のようなもの: ノードが挿入されたら、スクリプトを起動し、2 秒待ちます。

私はこのようなことを試みていますが、成功しません:

var check = 1;

document.addEventListener('DOMNodeInserted', function() {
    if(check == 1) {
        check = 0;
        setInterval( function() {

            //do stuff

            check = 1;

        }, 1000);

        console.log('fatto');
    }
}, true);

ありがとう

4

2 に答える 2

1

デバウンスと呼ばれるこの手法を見てきました。次に例を示します。

(function() {
    var timer;

    var doStuff = function() {
        timer = null;
        alert("Doing stuff");
    };

    document.addEventListener('DOMNodeInserted', function() {
        if (timer) {
            window.clearTimeout(timer);
        }
        timer = window.setTimeout(doStuff, 2000);
    }, false);
})();

これを一般化することができます:

function addDebouncedEventListener(obj, eventType, listener, delay) {
    var timer;

    obj.addEventListener(eventType, function(evt) {
        if (timer) {
            window.clearTimeout(timer);
        }
        timer = window.setTimeout(function() {
            timer = null;
            listener.call(obj, evt);
        }, delay);
    }, false);
}

addDebouncedEventListener(document, 'DOMNodeInserted', function(evt) {
    alert(evt.target.nodeName + " inserted");
}, 2000);
于 2012-06-06T11:13:44.867 に答える
0

私は言います:

var timeout;

document.addEventListener('DOMNodeInserted', function() {
    startNewTimeout();
}, true);

function startNewTimeout() {
    //only if there is no active timeout already
    if(timeout === undefined) {
        timeout = setTimeout( function() {

           timeout = undefined;
           //do stuff

        }, 1000);
    }
}

このスクリプトは、の実行を無期限に遅らせることはありません//do stuff//do stuff最大で実行されるようにします。DOMNodeInserted最初のイベントの 1 秒後。

于 2012-06-06T11:25:15.833 に答える