0

基本的なChrome拡張機能に問題があります。私の目標は、Webページからimg要素を取得することです。

マニフェスト.json:

{
    "name": "My first chrome extension",
    "version": "1.0",
    "background": { "scripts": ["script.js", "jquery-1.8.3.js"] },
    "permissions": [
        "http://*/*"
    ],
    "browser_action": {
        "name": "Do something with images",
        "icons": ["icon.png"]
    },
    "manifest_version": 2
}

script.js:

var imgs = [];

chrome.browserAction.onClicked.addListener(function(tab) {

//  imgs = document.getElementsByTagName("img");
    imgs = $('img');
    if(imgs.length > 0){
        alert("abc");
    }    
});

画像のあるページではアラートは表示されません。imgs.lengthは0です。一方、同じページのjavascriptコンソールでは、次のように入力します。

imgs = $('img');
imgs.length;

29枚の画像があります。どうしたの?

4

1 に答える 1

1

ハンドラーはページで実行されませonClickedん。代わりに、別の拡張環境内で実行されます。代わりに、スクリプトを etab に挿入する必要があります。

chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.tabs.executeScript(tab.id, {
        file: "img_script.js"
    });
});

img_script.js、拡張機能のスクリプト ファイルです。

または、必要に応じて次のようにします。

chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.tabs.executeScript(tab.id, {
        code: "imgs = $('img'); if(imgs.length > 0){alert('abc');}"
    });
});

ただし、これは可読性と将来のコード保守にとって恐ろしいことです。これを絶対にしないでください。

srcスクリプトがページ上でのみ動作する場合 (たとえば、ページ上のすべての画像のプロパティを新しい値に置き換えるだけの場合)、作業は完了です。結果をさらに処理するために拡張機能が必要な場合 (たとえば、ページにある画像の数を数えて、chrome.browserAction.setBadgeTextその数を呼び出したい場合)、挿入されたスクリプトで拡張機能にメッセージを返すようにします。

于 2013-01-02T21:28:18.547 に答える