2013-07-16 170 views
0

正在爲簡單的Chrome擴展程序編寫代碼,但在清除setTimeout的正確實例並更新正確的Chrome選項卡時遇到問題。我想爲URL請求設置定時器,如果收到響應,則應清除相應的實例。如果響應超時,定時器功能應該用dialog.html更新相應的窗口。問題是,響應會清除最後一個定時器,定時器功能會更新當前選項卡。我嘗試了window.setTimeout並將request.tabId作爲參數傳遞給定時器功能,但兩者都不起作用。感謝您的幫助,setTimeout並更新Chrome擴展程序中的正確選項卡

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

回答

1

你將不得不存儲多個超時,每個活動的要求之一。您可以通過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]; 
+0

謝謝。有效。 – Khan

+2

@汗很高興它的工作,你可以請標記答案爲接受? – rsanchez

相關問題