2016-11-18 12 views
0

次のコードを使用して、ユーザーが特定のサイトを訪問しようとしているかどうかを検出しています。Chrome拡張機能はURLを1回だけ検出できますか?

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毎回ユーザーナビゲーションを実行することです。そのURLを一度だけ検出し、サイト内のリンクがクリックされるたびに通知を表示しないようにする方法はありますか?
私はjavascriptとChrome Extension APIの初心者ですので、うまくいきます。

EDIT - 質問を明確にするために、ユーザーがページにいる間に一度だけURLを検出したいと思います。しかし、別のページに移動すると、そのURLが再び検出されます。たとえば、ユーザーはfoo.comに行き、通知が表示されます。ユーザーはページの周りをナビゲートし、これらのナビゲーションの通知はトリップされません。ユーザーはgoogle.comに行き、その後foo.comに戻り、通知が再度表示されます。

+0

が広すぎます。エクステンションの公式ドキュメントでストレージとバックグラウンドスクリプトの基礎を読んでください。 –

+0

一回だけ何を?日?再起動するまでセッションをブラウズしますか?拡張のライフタイム? – Xan

+0

@ Xan質問に編集を追加しました。 –

答えて

0

だからあなたの要件は次のとおりです。

  • ユーザーが最初の問題のサイトに移動すると、場合
  • 通知を表示する限り、ユーザーはそのサイト内でナビゲートする、何も
  • をしませんユーザーは特定のタブのために移動し、メカニズムを「リアームする」

したがって、基本的には、1ビット分の情報を格納する必要があるということです(「アームド」/「ディスアーム」 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ごとに値が1つのみの場合は、と大きくなる可能性は低いですが、タブが削除されたとき(onRemoved)または置き換えられたとき(onReplaced)、そのエントリをクリアすることができます。

+0

ありがとうございました。私はそれが毎回呼ばれることはないと気付いた、私は想像している[this](http://stackoverflow.com/a/21227525/2018846)が発生していることがわかった。私は 'if(info.status ==" complete "){// arm/disarm code}'を追加しましたが、それでも時間の100%は動かないようです。何が起こっているのだろうか? –

+0

'onReplaced'も同様に見る必要があるでしょう。または、実際には、 'webNavigation' APIの使用を検討してください。 – Xan

+0

お世話になりました!最初のページの読み込み時に通知が作成されるかどうかは関係ありません。それは通常、2ページ目(google内の最初のnav)にキャッチされます。com)それは私が必要なもののために大丈夫です。もう一度ありがとう!とても有難い。 –

関連する問題