2017-01-24 94 views
0

作为我的第一个扩展,我尝试使用chrome.webRequest API重新加载网页,当网页不可用时,Web服务器将请求重定向到另一个URL。如果发现重定向,则我的分机将继续尝试原始请求(tabs.reload)(发生onBeforeRedirect事件)。已将chrome.tabs.reload()重新加载除活动选项卡以外的选项卡

一切工作正常,除了我不能让它运行在多个选项卡上。该扩展程序可以创建一个选项卡并继续重新加载,但是当我单击扩展图标打开另一个选项卡或当单击其他非活动选项卡时,background.js停止运行。

如何修改它以在多个选项卡(例如,5个选项卡同时)上运行而不停止?

这里是background.js

chrome.browserAction.onClicked.addListener(function(activeTab) { 
    var newURL = "https://myurl"; 
    chrome.tabs.create({ url: newURL }); 
}); 

chrome.webRequest.onBeforeRedirect.addListener(function (details) { 
    console.log("Redirect -> Reload"); 
    chrome.tabs.reload(); 
}, { 
    urls: ["http://*/*", "https://*/*"] 
}, ["responseHeaders"]); 

chrome.webRequest.onResponseStarted.addListener(function (details) { 
    console.log("Response Started"); 
    console.log(details.url); 
    console.log(details.statusLine); 
    if (details.url === "https://myurl" && details.statusCode === 200) { 
     console.log("Finally"); 
    } 
}, { 
    urls: ["http://*/*", "https://*/*"] 
}, ["responseHeaders"]); 

manifest.json的

{ 
    "name": "My Tool", 
    "description": "My Tool", 
    "version": "1", 
    "manifest_version": 2, 

    "browser_action": { 
    "default_icon": "icon.png" 
    }, 
    "background": { 
    "scripts": ["background.js"] 
}, 
    "permissions":[ 
    "https://myurl", 
    "http://redirectedurl", 
    "webRequest", 
    "webRequestBlocking", 
    "tabs" 
    ] 
} 
+0

为什么你想你的扩展重新加载标签页时,URL重定向?对于服务器从重定向改变为服务页面的响应,*非常少见。 – Makyen

+0

我可以看到一些可能的原因,以便您可能希望扩展程序重新载入*特定的*选项卡或重定向的URL(例如,您想驻留在特定的URL直到响应可用)。但是,在这种情况下,您只需要在每个标签或每个URL基础上启用它,而不是所有标签。让它无差别地在所有标签上运行可能会破坏正常的网上冲浪。您可能还想在重新加载之间实施一些延迟,以限制您在特定URL上跳动的次数以及您在本地计算机上占用的资源。 – Makyen

+0

是的,这是我希望我的扩展程序重新加载选项卡的确切原因。我可能不会很好地描述我的问题。我的问题未能包含_specific_ tab,_particulart_ URL。 – piptan

回答

1

虽然我没有测试你的代码,一个原因,它不会对任何其他工作比当前窗口的活动选项卡更多的是,您不会将参数传递给chrome.tabs.reload()。如果没有参数,它会默认重新加载当前窗口中的活动选项卡,而不管哪个选项卡实际触发了chrome.webRequest.onBeforeRedirect事件。有这实际上触发了webRequest.onBeforeRedirect事件被重新加载的标签,你将需要与标签ID参数传递给chrome.tabs.reload(),是这样的:

chrome.tabs.reload(details.tabId); 
+0

我在查找解决方案期间多次看到此代码,但没有意识到情况。当我将它添加到我的扩展中时,它的功能就像一个魅力。谢谢。 – piptan

相关问题