如何在Chrome扩展中使用jQuery?
我正在写一个Chrome扩展。 我想在我的扩展中使用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
文件一起运行jQuery和我的work.js。
// 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' }); });
它工作正常,但我担心是否添加到这种方式执行的脚本正在asynchronous执行。 如果是的话,那么可能会发生这样的情况:即使在 jQuery(或者我将来添加的其他库) 之前 ,work.js也会运行。
我也想知道什么是使用第三方库的正确和最好的方式,在我的Chrome扩展。
你必须把你的jQuery脚本添加到你的chrome扩展项目中,并添加到你的manifest.json的background
部分,如下所示:
"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
来打开。
非常简单,只需执行以下操作:
在mainfest.json中添加以下行
"content_security_policy": "script-src 'self' https://ajax.googleapis.com; object-src 'self'",
现在你可以直接从url加载jquery
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
来源: 谷歌文档
它工作正常,但我担心是否添加到这种方式执行的脚本正在asynchronous执行。 如果是的话,那么可能会发生这样的情况:即使在jQuery(或者我将来添加的其他库)之前,work.js也会运行。
这应该不是一个问题:排队在某个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
更清晰的语法:
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。