提问者:小点点

如何在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"
    }
}

我的背景。jsfile只运行另一个名为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到我的扩展?

我试图运行jQuery随着我的work.js从background.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'
    });
});

它工作得很好,但我担心以这种方式添加的脚本是否正在异步执行。如果是的话,那么这项工作可能会发生。js甚至在jQuery(或我将来可能添加的其他库)之前运行。

我还想知道在我的chrome扩展中使用第三方库的正确和最佳方式是什么。


共3个答案

匿名用户

您必须将jquery脚本添加到chrome扩展项目和清单的background部分。json如下所示:

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

如果你需要jQuery在content_scripts中,你必须把它添加到清单中:

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

这就是我所做的。

此外,如果我没记错的话,后台脚本是在后台窗口中执行的,您可以通过chrome://扩展名打开该窗口。

匿名用户

它很容易,只需做以下操作:

在清单中添加以下行。json

"content_security_policy": "script-src 'self' https://ajax.googleapis.com; object-src 'self'",
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>

来源:谷歌文档

匿名用户

这真的不应该是一个问题:您将脚本排队在某个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);

或者,promise(并与适当的签名更加一致):

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/等待-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中,您只需使用浏览器即可。标签。executeScript,因为它将返回一个promise。