Javascript Chrome扩展:延迟打开选项卡

Javascript Chrome扩展:延迟打开选项卡,javascript,jquery,google-chrome,google-chrome-extension,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 !== unde

我正在做一个扩展,它有一个背景页面(和一个与之相关联的脚本: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++;
    }
});
如您所见,当变量数据未定义时,数据[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个选项卡。我试过使用settimut,但没有成功

tl;博士: 数据数组被发送到后台页面,一个接一个地打开选项卡,间隔10秒


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

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

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);
    }

    // ...
});

库中有一些节流算法的实现,如和。

与您的问题无关,但是否希望在每次收到消息时添加一个更新的事件处理程序?最终会有许多处理程序试图删除同一个选项卡。如果只添加一个处理程序,则每次触发
onUpdated
事件时仍将运行该处理程序。感谢您的回答,这看起来很棒,但是由于某种原因,只有邮件的背景页url被打开。(所以如果有20条记录,只有第20条被打开)我用了下划线。对不起,我误解了你的问题。如果您希望在选项卡中打开所有URL,但每个选项卡打开之间有一个延迟,则可以使用
.throttle
(相同的参数)。我遇到了另一个问题:出于某种原因,throttle只打开2个选项卡(第一个和最后一个),它按预期工作,但如果我有n条记录,只有在新选项卡中打开的第一个和最后一个选项卡可能是
\uThrottle
函数在一个油门窗口内发生多个事件时抛出事件。如果是这样,您可能需要一个更复杂的异步库。我曾经使用过,它非常强大(尽管这是一个有点挑战性的学习曲线)。我认为这是你想要解决的问题。