2016-02-29 196 views
0

如果用戶沒有在擴展上登錄,我正在實現一個附加到頁面的通知,但我只希望擴展在每個瀏覽器會話中執行一次,以便它們不會獲得如果他們沒有登錄,他們訪問的每個頁面都會產生令人討厭的通知。Chrome擴展後臺頁面狀態

他們這樣做的方式是通過將我的後臺腳本中的布爾值初始化爲false,它表示是否在之前添加了通知。

每當用戶沒有在背景腳本記錄將收到消息和基於它上面提到的將通知他們還沒有登錄用戶的布爾值。

background.js

var has_been_notified = false; 
chrome.extension.onMessage.addListener(function(msg, sender) { 
    if(!has_been_notified) { 
     chrome.tabs.sendMessage(sender.tab.id, "login_notification"); 
     has_been_notified = true; 
    } 
}) 

條件應該運行一次,並且一旦布爾值更改爲true,就不會再次運行。這是假設後臺腳本的狀態在整個瀏覽器會話中保留並且不會再次部署。

當我測試擴展時,即使在初始通知已經觸發後,一些隨機頁面也會收到通知。得到它的網頁大約是每10頁中有1頁,但是我訪問的網站完全是任意的。

回答

4

聽起來像你試圖使用"persistent": falseEvent page。這是推薦的方法,但它有責任瞭解它是如何工作的。

定期地,如果你的後臺腳本沒有做任何事情(十分之一秒),它將完全卸載。這會丟失JavaScript上下文的狀態,包括所有變量。 Chrome會記住哪些事件具有偵聽器,如果事件發生,則頁面再次加載,然後觸發事件。

如果您需要在整個瀏覽器會話期間保持內存中的運行時狀態,請使用storage API或IndexedDB。由於事件頁面不會長時間保持加載狀態,因此不能再依賴運行時狀態的全局變量。

所以你需要保存在chrome.storage.local狀態:

// Don't use extension.sendMessage/onMessage, it's deprecated 
chrome.runtime.onMessage.addListener(function(msg, sender) { 
    chrome.storage.local.get(
     {has_been_notified: false}, // Providing a default if storage is empty 
     function(data) { 
      if(!data.has_been_notified) { 
       chrome.tabs.sendMessage(sender.tab.id, "login_notification"); 
       chrome.storage.local.set({has_been_notified: true}); 
      } 
     } 
    ); 
}); 

如果您需要在每個分機啓動復位此,勾入runtime.onStartup而不是腳本執行(可重新啓動反覆):

chrome.runtime.onStartup.addListener(function() { 
    chrome.storage.local.set({has_been_notified: false}); 
}); 
+0

感謝您的徹底解釋和反饋有關棄用。要明確,chrome.runtime.sendMessage/onMessage是否是正確的替代品? – Ephapox

+0

是的,這是直接替換。 – Xan

相關問題