2016-11-18 46 views
0

我正在使用以下代碼來檢測用戶是否即將訪問特定網站。Chrome擴展程序可以只檢測一次URL嗎?

var array = ["foo.bar", "foo.com", "foo.org"]; 

chrome.tabs.onUpdated.addListener(function (id, info, tab) { 
    for (var i = 0, len = array.length; i < len; i++) { 
     if (tab.url.indexOf(array[i]) != -1) { 

      chrome.notifications.create('main', { 
       type: 'basic', 
       iconUrl: 'icon.png', 
       title: 'Title Message', 
       message: 'Message Body' 
     }, function(notificationId) {}); 
    } 
}}); 

的問題是,它每次運行用戶導航foo.com例如。有沒有辦法只檢測一次該網址,並且每次點擊該網站中的鏈接時都不會顯示通知?
我是新來的JavaScript和Chrome擴展API,所以希望我可以跟着。

編輯 - 爲了澄清問題,我希望它在用戶在頁面上時只檢測一次URL。但是,如果他們導航到另一個頁面,它會再次檢測到該URL。例如,用戶轉到foo.com並顯示通知。用戶在頁面周圍導航,並且通知不會爲這些導航而跳閘。用戶轉到google.com,然後返回到foo.com,並再次顯示通知。

+0

太寬泛。在擴展官方文檔中閱讀存儲和後臺腳本的基礎知識。 –

+0

只有一次..什麼?天?瀏覽會話,直到重新啓動?延期的生命期? – Xan

+0

@Xan我已經添加了對該問題的編輯。 –

回答

0

所以,你的要求是:

  • 當用戶第一次瀏覽到有問題的部位,顯示通知
  • 只要用戶該站點內導航,不要做任何
  • 如果用戶導航(對於特定的選項卡),「重新啓動」該機制

所以基本上,我們從那裏拿走的是你需要存儲1位價值的信息(「武裝」/「disarme d「)每個標籤(或具體而言,每個標籤ID)。在瀏覽器會話之間不需要持久性,所以只需要一個持久的背景頁面就足夠了(如果您想使用活動頁面,則需要chrome.storage,但它不在回答的範圍內)。

下面是一個例子,以「報警」 /「陷阱」術語一致:

var disarmed = {}; // Will contain tab IDs that are disarmed 
        // disarmed[tabId] is false by default 

var hosts = ["foo.bar", "foo.com", "foo.org"]; 

chrome.tabs.onUpdated.addListener(function (id, info, tab) { 
    var trigger = false; // Determines if our condition is met 

    hosts.forEach(function(hostname) { 
    // Note: this is a bad condition - will trigger on http://example.com/?q=foo.com 
    // But that's for you to fix 
    if (tab.url.indexOf(hostname) != -1) { 
     trigger = true; 
    } 
    }); 

    if (trigger) { 
    // Condition satisfied, see if we need to notify 
    if (!disarmed[tab.id]) { 
     notify(tab); // You may want to know the URL in notify() 
     disarmed[tab.id] = true; 
    } 
    } else { 
    // Condition no longer satisfied, rearm 
    disarmed[tab.id] = false; 
    } 
}); 

function notify(tab) { 
    chrome.notifications.create('main', { 
    type: 'basic', 
    iconUrl: 'icon.png', 
    title: 'Title Message', 
    message: 'Message Body' 
    }, function(notificationId) {}); 
} 

一點點在這裏關注的是,隨着時間的推移,disarmed的大小會增加。如果每個標籤ID只有一個值,那麼很可能不會增加,但當標籤被移除(onRemoved)或替換(onReplaced - 您需要更改時也需要注意)時,您可以清除其中的條目(delete disarmed[tabId])。

+0

非常感謝解決方案。我注意到它不會每次都被調用,並且我發現[this](http://stackoverflow.com/a/21227525/2018846),我想它正在發生。我加了'if(info.status ==「complete」){// arm/disarm code}',但它似乎仍然不能100%的工作。任何想法可能會發生什麼? –

+0

可能你也必須觀看'onReplaced'。或者,實際上,可以考慮使用'webNavigation' API。 – Xan

+0

感謝您的幫助!我發現通知是在第一次加載頁面時創建的並不重要。它通常會在第二頁上被捕獲(谷歌中的第一個導航欄。com),這對我所需要的沒有問題。不過謝謝你!非常感激。 –

相關問題