Javascript Chrome扩展:延迟打开选项卡
我正在做一个扩展,它有一个背景页面(和一个与之相关联的脚本:eventPage.js)和一个内容脚本(work.js) 内容脚本扫描网页,并以数组形式检索数据: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
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
函数在一个油门窗口内发生多个事件时抛出事件。如果是这样,您可能需要一个更复杂的异步库。我曾经使用过,它非常强大(尽管这是一个有点挑战性的学习曲线)。我认为这是你想要解决的问题。