Chrome拡張機能でjQueryを使用する方法


128

私はクローム拡張を書いています。そしてjQuery、拡張機能で使用したいと思います。バックグラウンドページは使用せず、バックグラウンドスクリプトのみを使用しています

これが私のファイルです:

manifest.json

{
    "manifest_version": 2,

    "name": "Extension name",
    "description": "This extension does something,",
    "version": "0.1",

    "permissions": [
        "activeTab"
    ],

    "browser_action": {
        "default_icon": "images/icon_128.png"
    },

    "background": {
        "scripts": ["background.js"],
        "persistent": false
    },

    "icons": {
        "16": "images/icon_16.png",
        "48": "images/icon_48.png",
        "128": "images/icon_128.png"
    }
}

私のbackground.jsファイルは、work.js

// Respond to the click on extension Icon
chrome.browserAction.onClicked.addListener(function (tab) {
    chrome.tabs.executeScript({
        file: 'work.js'
    });
});

私の拡張機能の主なロジックは内部work.jsです。この質問ではここでは重要ではないと思う内容がここにあります。

私が聞きたいのは、拡張機能でjQueryをどのように使用できるかです。背景ページは使用していませんので。それにjQueryを追加することはできません。では、拡張機能にjQueryを追加して使用するにはどうすればよいですか?

background.jsファイルからwork.jsと一緒にjQueryを実行してみました。

// Respond to the click on extension Icon
chrome.browserAction.onClicked.addListener(function (tab) {
    chrome.tabs.executeScript({
        file: 'thirdParty/jquery-2.0.3.js'
    });
    chrome.tabs.executeScript({
        file: 'work.js'
    });
});

また、問題なく動作しますが、この方法で実行するために追加されたスクリプトが非同期で実行されているかどうか心配です。はいの場合、work.jsがjQuery(または将来追加する可能性のある他のライブラリ)のでも実行される可能性があります。

また、Chrome拡張機能で、サードパーティのライブラリを使用するための正しい最良の方法を教えてください。


2
正しい方法はバニラに行くことです!
bjb568 2014

あなたはここに(私があったように)ポップアップ延長にjQueryのを追加する方法を探しているなら、この質問を参照してください。stackoverflow.com/questions/12035242/...
プロQ

回答:


124

次のように、jqueryスクリプトをchrome-extensionプロジェクトとbackgroundmanifest.json のセクションに追加する必要があります。

  "background":
    {
        "scripts": ["thirdParty/jquery-2.0.3.js", "background.js"]
    }

content_scriptsにjqueryが必要な場合は、マニフェストにも追加する必要があります。

"content_scripts": 
    [
        {
            "matches":["http://website*"],
            "js":["thirdParty/jquery.1.10.2.min.js", "script.js"],
            "css": ["css/style.css"],
            "run_at": "document_end"
        }
    ]

これは私がやったことです。

また、正しく思い出せば、バックグラウンドスクリプトは、を介して開くことができるバックグラウンドウィンドウで実行されますchrome://extensions


7
さて、どういう意味You have to add your jquery script to your chrome-extension projectですか?私はこれを行いました:manifest.json: "background": { `" scripts ":[" thirdParty / jquery-2.0.3.js "、" background.js "]、` `" persistent ":false``}、 `をダウンロードしましたjQueryをthirdPartyフォルダーに。しかし、私はまだjQueryを使用できません。それはエラーを出します:Uncaught ReferenceError: $ is not defined 私はこれをwork.jsテストのために私のファイルに追加しました。 $("body").html("Foo!");
イシャン

上記のコメントは混乱しているように見えますが、コメントの追加中はプレビューが表示されません。そのためご容赦ください。
イシャン

それをchrome-extensionフォルダーに追加することを意味します。/home/you/chromexetension_source_files/thirdParty/jquery-2.0.3.jsのように。work.jsでも同じことを行う必要があります。
Nico

1
私はあなたが言ったことをやってみました。しかし、work.jsファイルからjqueryにアクセスできないという同じエラーが発生します。Uncaught ReferenceError: $ is not defined。できれば、実際の例をどこかにアップロードしてください。'$( "body")。html( "Foo!");'のような単純な例 work.js内。
Ishan

7
また、自分が認識されjQueryたり$、認識されたりするのに苦労しました。マニフェスト配列の最後でjQueryを参照していることがわかりました。私が最初にそれを置いたとき、それは認識されました。
BenR、2015年

18

次のようにすれば、とても簡単です。

manifest.jsonに次の行を追加します

"content_security_policy": "script-src 'self' https://ajax.googleapis.com; object-src 'self'",

これで、jQueryをURLから直接読み込むことができます

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>

出典:google doc


1
ロードするスクリプトが複数ある場合はどうなりますか?
他の

1
リモートサーバーからスクリプトをロードする場合に最適です(リモートサーバーを拡張機能とそれにアクセスできるすべてのもので信頼する必要があります)。
Nathaniel Verhaaren

1
@NathanielVerhaarenこれは妥当なポイントですが、subresource integrity(SRI)を使用してソースを確認することで軽減できます。
Dan Atkinson

13

そして、それは正常に動作しますが、この方法で実行するために追加されたスクリプトが非同期で実行されているかどうか心配です。はいの場合、work.jsがjQuery(または将来追加する可能性のある他のライブラリ)の前でも実行される可能性があります。

これは実際には問題になりません。特定のJSコンテキストで実行されるスクリプトをキューに入れ、そのコンテキストはシングルスレッドであるため、競合状態を持つことはできません。

ただし、この懸念を解消する適切な方法は、呼び出しをチェーンすることです。

chrome.browserAction.onClicked.addListener(function (tab) {
    chrome.tabs.executeScript({
        file: 'thirdParty/jquery-2.0.3.js'
    }, function() {
        // Guaranteed to execute only after the previous script returns
        chrome.tabs.executeScript({
            file: 'work.js'
        });
    });
});

または、一般化:

function injectScripts(scripts, callback) {
  if(scripts.length) {
    var script = scripts.shift();
    chrome.tabs.executeScript({file: script}, function() {
      if(chrome.runtime.lastError && typeof callback === "function") {
        callback(false); // Injection failed
      }
      injectScripts(scripts, callback);
    });
  } else {
    if(typeof callback === "function") {
      callback(true);
    }
  }
}

injectScripts(["thirdParty/jquery-2.0.3.js", "work.js"], doSomethingElse);

または、約束された(そして適切な署名と一致するようにされた):

function injectScript(tabId, injectDetails) {
  return new Promise((resolve, reject) => {
    chrome.tabs.executeScript(tabId, injectDetails, (data) => {
      if (chrome.runtime.lastError) {
        reject(chrome.runtime.lastError.message);
      } else {
        resolve(data);
      }
    });
  });
}

injectScript(null, {file: "thirdParty/jquery-2.0.3.js"}).then(
  () => injectScript(null, {file: "work.js"})
).then(
  () => doSomethingElse
).catch(
  (error) => console.error(error)
);

または、なぜ一体ではないのか、async/ await-edでさらに明確な構文を得る:

function injectScript(tabId, injectDetails) {
  return new Promise((resolve, reject) => {
    chrome.tabs.executeScript(tabId, injectDetails, (data) => {
      if (chrome.runtime.lastError) {
        reject(chrome.runtime.lastError.message);
      } else {
        resolve(data);
      }
    });
  });
}

try {
  await injectScript(null, {file: "thirdParty/jquery-2.0.3.js"});
  await injectScript(null, {file: "work.js"});
  doSomethingElse();
} catch (err) {
  console.error(err);
}

Firefoxではbrowser.tabs.executeScript、Promiseを返すため、そのまま使用できます。


最初の方法は素晴らしいです。JavaScriptをあまり知らない人として、私はそのようなことを考えたことはありませんでした。
FriskySaga

11

すでに述べたソリューションとは別に、ダウンロードすることもできます jquery.min.jsローカルにて使用 -

ダウンロード用-

wget "https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"

manifest.json-

"content_scripts": [
   {
    "js": ["/path/to/jquery.min.js", ...]
   }
],

HTMLで-

<script src="/path/to/jquery.min.js"></script>

リファレンス-https://developer.chrome.com/extensions/contentSecurityPolicy


3
これが最善の方法です... HTMLの部分は必要ありません。
c-an

1

私の場合、クロスドキュメントメッセージング(XDM)とページの読み込みの代わりにChrome拡張機能onclickを実行することで、実用的なソリューションが得られました。

manifest.json

{
  "name": "JQuery Light",
  "version": "1",
  "manifest_version": 2,

  "browser_action": {
    "default_icon": "icon.png"
  },

  "content_scripts": [
    {
      "matches": [
        "https://*.google.com/*"
      ],
      "js": [
        "jquery-3.3.1.min.js",
        "myscript.js"
      ]
    }
  ],

  "background": {
    "scripts": [
      "background.js"
    ]
  }

}

background.js

chrome.browserAction.onClicked.addListener(function (tab) {
  chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {
    var activeTab = tabs[0];
    chrome.tabs.sendMessage(activeTab.id, {"message": "clicked_browser_action"});
  });
});

myscript.js

chrome.runtime.onMessage.addListener(
    function (request, sender, sendResponse) {
        if (request.message === "clicked_browser_action") {
        console.log('Hello world!')
        }
    }
);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.