2013-10-14 169 views
9

我想模仿window.location.reload()的效果,但僅適用於運行內容腳本的「孤立的世界」。也就是說,刪除所有現有的JS,尤其是回調和事件綁定。有沒有一個很好的方法來做到這一點?重新加載Chrome擴展內容腳本執行環境

注意:chrome.runtime.reload()不適用於此;它具有重新加載擴展和後臺腳本的效果,但它不會在用戶刷新之前重新加載現有的內容腳本。

回答

4

據我所知,沒有自動的方式來重新注入內容腳本,例如在擴展更新期間。你可以做的是找到所有標籤的url匹配你需要的模式,並以編程方式重新注入使用chrome.tabs.executeScript的內容腳本。

請注意,此方法需要爲內容腳本所使用的方法添加相同URL模式的權限。

manifest.json的:

"content_scripts":  
[ 
    { 
     "matches": [ "http://*.google.com/*" ], 
     "js": [ "content_script.js" ] 
    } 
], 
"permissions":   
[ 
    "tabs", "http://*.google.com/*" 
] 

Background.js:

chrome.runtime.reload(); 
chrome.tabs.query({ url: "http://*.google.com/*" }, function(tabs) 
{ 
    for(var i = 0; i < tabs.length; i++) 
    { 
     chrome.tabs.executeScript(tabs[i].id, { file: "content_script.js" }, function() {}); 
    } 
}); 
+1

的問題是,這會保持現有的情況下保持不變。如果我在一個executeScript中啓動setInterval,它將在下一個executeScript之後繼續運行。 –

+0

當第二次執行第二個內容腳本時,您可以訪問以前的變量,因此您可以重置所有內容。 –

+0

@Metoule在從'chrome:// extension'重新加載擴展後注入時,您無法訪問以前的變量。你測試過了嗎? – vaughan