1

ユーザーがアイコンをクリックしたときにポップアップを表示しようとしています。ポップアップは、URL に「chrome://」または「about:」が含まれていない場合にのみ表示されます。それはうまくいきます。しかし、通常のページでは、アイコンを 2 回目にクリックしたときにのみポップアップが表示されます。最初のクリックでは何も起こりません。from background.html のコードは次のとおりです。

// Called when the user clicks on the browser action.
chrome.browserAction.onClicked.addListener(function(tab) {
    if (!tab.url.indexOf('chrome://') ||!tab.url.indexOf('about:')) {
        alert('For security reasons, this page cannot shared.');
        return;
    }
    else {
        chrome.browserAction.setPopup({tabId:tab.id,popup:"html/popup.html"});
    }
});

私は何を間違っていますか?

4

2 に答える 2

3

あなたの問題を正しく再現した後、何が起こっているのかわかりました。最初のクリックでポップアップが表示されない理由は、表示するポップアップがないためです。

考えてみてください。ブラウザのアイコンをクリックした、ポップアップを設定しています。何を表示する必要がありますか?わかりませんが、イベントはすでにトリガーされているため、デフォルトのメカニズムは何を表示するかわかりません。ブラウザ内に組み込まれていない単なるJavaScriptメカニズムであるイベントハンドラー内で、それを設定しますが、それはすでに遅いです。ただし、2 回目 (および 3 回目以降など) では、表示するポップアップがわかっているため、実際にはポップアップが表示されます。

ソリューション?明白な 1 つは、ポップアップを manifest.json の一部として配置することです。

"browser_action": {
  "default_icon": "icons/icon19.png",
  "default_title": "browser action demo",
  "default_popup": "src/browser_action/browser_action.html"
},

もちろん、これを行うchrome.browserAction.onClickedと が起動されないことを意味しますが、公平を期すために、最初にランディング ポップアップをユーザーに提供する必要があります。後でポップアップを表示したい場合は、それを行うインターフェイスを提供します (クリックするとメッセージを backgroundPage に送信してポップアップを変更するボタン)。

他のオプションとして、ハンドラーbeforeShowポップアップを使用することもできますが、API でそのようなものを見つけられなかったので、希望を捨てません。

于 2013-01-04T00:40:13.263 に答える
0

相互に排他的な 2 つのイベントを 1 つの機能に混在させているようです。

chrome.browserAction.onClickedポップアップを使用しない場合に使用します。

次のスクリプトは、background.html で 1 回だけ実行されます。

chrome.browserAction.onClicked.addListener(function (tab) {
    console.log("Is fired..");
    chrome.browserAction.setPopup({
        popup: "popup.html"
    });

});

任意のロジック (URL やコンテンツなど) でポップアップ ページを変更する場合は、すべてのタブ ID のバックグラウンド ページに配置します。ところで、あなたが探しているビジネスロジックは何ですか?

于 2013-01-04T12:11:40.007 に答える