0

我正在制作一个扩展,它有一个背景页面(以及与之关联的脚本:eventPage.js)和一个内容脚本(work.js)

内容脚本扫描网页,并检索数组中的数据:

var datas = new Array();
var i = 0;
$('.szovegbox_kn tbody').each(function () {
    var data = $(this).first("tr").find("td:nth-child(5)").html();

    if (data !== undefined) {
        datas[i] = data.replace(/\s/g, '');
        chrome.runtime.sendMessage({
            data: datas[i]
        });
        i++;
    }
});

如您所见,当变量 data 未定义时, data[i] 被发送到后台页面。

这是我的背景页面的脚本:

chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
    if (request.data !== undefined) {
        var data = request.data;
        var newURL = "http://www.something.com/loadpage.php?dest=" + data;
        chrome.tabs.create({
            url: newURL
        });

        chrome.tabs.onUpdated.addListener(function (tabId, changeInfo) {
            if (changeInfo.status === 'complete') {
                window.setTimeout(function () {
                    chrome.tabs.remove(tabId);
                }, 3000);
            }
        });
    }
});

我想做的是,当一条有效消息(其类型不是未定义的)到达后台页面时,选项卡的创建会延迟 n 秒,并且只有一个选项卡会被创建,直到选项卡关闭。现在,如果在我的 datas[] 数组中有 100 条记录,我的后台页面会立即打开所有 100 个选项卡。我尝试使用 setTimout,但没有成功。

tl; dr:数据数组被发送到后台页面,一个一个打开选项卡,它们之间有十秒的延迟。

如果您需要更多信息,我可以提供

4

1 回答 1

2

听起来您想限制事件处理逻辑。

var tabCreationDelay = 10000; //milliseconds

var createTabThrottled = _.throttle(function(url){
    chrome.tabs.create({
        url: url
    });
}, tabCreationDelay);

chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
    if (request.data !== undefined) {
        var data = request.data;
        var newURL = "http://www.something.com/loadpage.php?dest=" + data;
        createTabThrottled(newURL);
    }

    // ...
});

在UnderscoreLo-Dash等库中有节流算法的实现。

于 2013-09-11T07:57:12.887 回答