2010-07-28 79 views
3

當一個腳本注入Safari瀏覽器擴展時,它會在頁面加載時運行,這意味着當安裝擴展時,注入的javascript將只應用於新打開的頁面或之後重新加載的頁面。有誰知道如何確保JavaScript運行而無需重新加載?安裝時自動重裝

另外,迫使用戶加載......雖然這似乎有點危險。

+0

我不知道這個問題是顯而易見的。這當然不是我。腳本可以在頁面加載的開始或結束時注入。它們會在每個請求和每個嵌入的HTML源元素(例如iframe)上加載。 – 2010-07-28 17:33:39

+0

爲什麼安裝擴展程序後需要自動重新加載頁面? – zneak 2010-07-30 04:45:42

+0

嗯,我猜我不一定希望它自動重新加載,但因爲腳本是在頁面加載之前或之後注入的,所以擴展不會立即生效,這是我想要實現的。你明白我的意思嗎? – basicallydan 2010-07-30 16:53:06

回答

0

我也試着找到一種方法來「安裝」上「執行」或「附加」一個腳本。這可以在Chrome和Firefox中使用,無需重新加載頁面。不幸的是,在Safari中我還沒有找到一種方法來做到這一點,而無需重新加載頁面,並讓普通的addContentScript處理程序負責注入腳本。

要重新加載所有Safari瀏覽器選項卡已安裝擴展後直接:

/* In glabal.js */ 

// Reloads all tabs 
function reloadTabs() { 
    var browserWindows = safari.application.browserWindows; 
    for (var i = 0; i < browserWindows.length; i++) { 
    var tabs = browserWindows[i].tabs; 
    for (var j = 0; j < tabs.length; j++) { 
     tabs[j].url = tabs[j].url; 
    } 
    } 
} 

// Called on first run 
function onInstall() { 
    reloadTabs(); 
} 

var firstRun = localStorage['extensionHasPreviouslyRun'] === undefined || 
    !JSON.parse(localStorage['extensionHasPreviouslyRun']); 

if (firstRun) { 
    onInstall(); 
    localStorage['extensionHasPreviouslyRun'] = JSON.stringify(true); 
} 
+0

糟糕。我錯過了localStorage只處理字符串,所以我們必須補償,例如通過引入JSON.parse和JSON.stringify。答案已更新。 – Claudijo 2012-07-17 10:23:20