0

我正在开发一个 chrome 插件,为页面中的每个元素注入一个类。但是在 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 回答