Chrome扩展程序:打开延迟标签

时间:2013-09-11 06:50:51

标签: javascript jquery google-chrome google-chrome-extension

我正在制作一个扩展程序,它有一个后台页面(和一个与之关联的脚本: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 [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: 数据数组被发送到后台页面,逐个打开标签,它们之间有10秒的延迟。

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

1 个答案:

答案 0 :(得分:1)

听起来你想要限制你的事件处理逻辑。

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等库中实施了限制算法。