12

これは私のbackground.jsファイルです

 chrome.tabs.onUpdated.addListener(function(tabId,info, tab) {
    var sites =new Array('site2','site1');
    var url=tab.url;
    var siteFlag=0;
    for(var i in sites) {
       var regexp = new RegExp('.*' + sites[i] + '.*','i');
       if (regexp.test(url)) {siteFlag=1;}
    };
    if(siteFlag==1){
      chrome.tabs.executeScript(tabId, {file:"contentscript.js"});
      chrome.tabs.executeScript(tabId, {file:"jquery.js"});
      chrome.tabs.insertCSS(tabId,{file:"box.css"});
    }
 });

contentscript.jsでは、ポップアップボックスを実行するだけです。

$(document).ready(function () {
    function popup() {...}
    if (window.addEventListener)
    {
        window.addEventListener('load', popup(), false); 
    } 
    else if (window.attachEvent)
    {
        window.attachEvent('onload', popup());
    }
});

ポップアップボックスが1つあるページもあれば、2つ以上あるページもあります。

何が問題ですか?

=============編集==================

それらのページにはIframeが含まれています

4

4 に答える 4

11

chrome.tabs.onUpdated.addListenerタブのステータスが変更されたときに発生します。これはiframeとは関係ありません。スクリプトは、ステータスが変更されるたびに挿入するため、同じフレームに複数回挿入されます。また、ステータスが「完了」に変更された場合にのみスクリプトを挿入する必要があります。以下を追加してコードを変更しますif (changeInfo.status == "complete") {

chrome.tabs.onUpdated.addListener(function(tabId,info, tab) {
   if (info.status == "complete") {
      /* checking & injecting stuff */
   }
});
于 2012-10-31T07:13:56.830 に答える
9

コンテンツスクリプトが2回読み込まれる理由がわかりません。しかし、私もこの問題を抱えていました。マニフェスト.jsonの「content_scripts」要素に以下を追加しましたが、問題なく機能しました。

"content_scripts" : [
    {
        "all_frames" : false,
        "run_at" : "document_end",
    }
]

最後に、manifest.json:

{
    "name": "ABC",
    "version": "0.0.0.1",
    "manifest_version": 2,
    "key": "longkeyhere",
    "description": "Description",
    "minimum_chrome_version": "29",
    "background": {
        "scripts": [
            "jquery.js",
            "jquery.min.js",
        ]
    },
    "content_scripts" : [
        {
            "all_frames" : false,
            "run_at" : "document_end",
            "matches" : [ "http://*/*" ],
            "js" : [
                "jquery.js",
                "jquery.min.js",
            ]
        }
    ],
    "options_page": "options.html",
    "permissions": [
        "http://*/*",
        "https://*/*",
        "contextMenus",
        "tabs",
        "identity",
        "storage"
    ]
}
于 2014-11-15T23:00:48.673 に答える
1

ほとんどの場合、これはフレームを使用しているページが原因です。スクリプトはフレームごとに読み込まれます。スクリプトを絶対に1回だけ実行したい場合は、ロードされているフレーム、または1つのフレームにすでにスクリプトが含まれているかどうかを検出できる場合があります。

于 2012-10-30T22:58:32.547 に答える
1

拡張機能のマニフェストファイルを使用して、コンテンツスクリプトの実行を制御できます。コンテンツスクリプトがiframeまたは特定のURLセットに読み込まれないようにすることができます。マニフェストセクションの例は次のとおりです。

"all_frames": true,
 "js": [ "ContentOnDocStart.js" ],
 "matches": [ "http://*/*", "https://*/*" ],
 "exclude_matches": [ ],
 "run_at": "document_start"
于 2012-10-31T13:02:05.377 に答える