Google chrome extension 设置超时并更新Chrome扩展中的正确选项卡
我正在为一个简单的Chrome扩展编写代码,但是在清除Google chrome extension 设置超时并更新Chrome扩展中的正确选项卡,google-chrome-extension,timer,tabs,Google Chrome Extension,Timer,Tabs,我正在为一个简单的Chrome扩展编写代码,但是在清除setTimeout的正确实例和更新正确的Chrome选项卡时遇到了问题。我想将请求的计时器设置为URL,如果收到响应,则应清除相应的实例。如果响应超时,计时器函数应使用dialog.html更新相应的窗口。问题是,响应会清除最后一个计时器,计时器功能会更新当前选项卡。我尝试了,window.setTimeout并将request.tabId作为参数传递给timer函数,但两者都不起作用。谢谢你的帮助 background.js var fl
setTimeout
的正确实例和更新正确的Chrome选项卡时遇到了问题。我想将请求的计时器设置为URL,如果收到响应,则应清除相应的实例。如果响应超时,计时器函数应使用dialog.html
更新相应的窗口。问题是,响应会清除最后一个计时器,计时器功能会更新当前选项卡。我尝试了,window.setTimeout
并将request.tabId
作为参数传递给timer函数,但两者都不起作用。谢谢你的帮助
background.js
var flag = false;
var new_url;
var timeout;
function resp_timeout(){
var dialog_url = chrome.extension.getURL("dialog.html");
chrome.tabs.update({url: dialog_url});
}
chrome.webRequest.onBeforeRequest.addListener(
function interceptRequest(request) {
if (isOn) {
original_url = request.url;
if (request && request.url) {
if(flag){
new_url = request.url;
}
else {
new_url = request.url.replace("http","https");
timeout = setTimeout(resp_timeout, 500);
}
return { redirectUrl: new_url }
}
}
}, {urls: ['http://*/*']}, ['blocking']);
chrome.webRequest.onHeadersReceived.addListener(function(details) {
if (isOn) {
clearTimeout(timeout);
return {responseHeaders:headers};
}
}, {urls: ['*://*/*']}, ['responseHeaders','blocking']);
dialog.js:
var bg = chrome.extension.getBackgroundPage();
function ok_handler(){
window.open(bg.original_url, "_self");
}
function cancel_handler(){
window.close();
}
document.addEventListener('DOMContentLoaded', function () {
document.querySelector('#ok_button').addEventListener('click', ok_handler);
document.querySelector('#cancel_button').addEventListener('click', cancel_handler);
});
您必须存储多个超时,每个活动请求一个。您可以通过
requestId
来识别它们。此外,您还需要生成不同的回调函数,每个回调函数都要更新相应的选项卡:
var timeouts = {};
function get_resp_timeout(tabId, requestId) {
return function() {
var dialog_url = chrome.extension.getURL("dialog.html");
chrome.tabs.update(tabId, {url: dialog_url});
delete timeouts[requestId];
}
}
...
timeouts[request.requestId] = setTimeout(
get_resp_timeout(request.tabId, request.requestId), 500);
...
clearTimeout(timeouts[details.requestId]);
delete timeouts[details.requestId];