Google Chrome 扩展:如何在以编程方式注入的内容脚本中包含 jQuery?

IT技术 javascript jquery google-chrome-extension
2021-03-02 01:42:27

当用户单击浏览器操作按钮时,后台页面注入我的内容脚本,如下所示:

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

那么如何从我的内部访问 jQuerycontent.js呢?我没有看到同时注入的方法。

5个回答

关于什么:

chrome.tabs.executeScript(null, { file: "jquery.js" }, function() {
    chrome.tabs.executeScript(null, { file: "content.js" });
});

您可以从这里下载“jquery.js”:http : //jquery.com/download/

@Aerovistae 你也可以直接下载它,它会更快也更安全。serg,如此简单却如此有效!绝妙的解决方案!
2021-04-17 01:42:27
但是...如果您在 googleapis.com 上使用托管的 jQuery 呢?
2021-04-18 01:42:27
$ 仍然没有定义。
2021-04-23 01:42:27
哈!杰出的。作品!谢谢:D
2021-04-26 01:42:27
那会把他们扔进同一个“孤立的世界”吗?我试一试!
2021-04-27 01:42:27

如何将它添加到您的清单文件中

"content_scripts": [
    {
        "js": [
                "jquery.js", 
                "contentscript.js"
            ]
    }
],
@ManuelFaux 是的。您需要添加一个“匹配”属性来控制它将在其上执行 jQuery 的域。
2021-04-25 01:42:27
即使不需要,这不会使 Chrome 在每个选项卡中解析 jQuery 吗?
2021-04-26 01:42:27
我在哪里可以找到这个“jquery.js”?
2021-05-06 01:42:27
@Daniel 你必须下载它(code.jquery.com),将它命名为“jquery.js”,如果你想使用他的确切代码,把它留在同一个目录中
2021-05-10 01:42:27
这个答案不是问题的解决方案。提问者需要一个编程注入(developer.chrome.com/extensions/content_scripts#pi),它是通过点击浏览器操作按钮触发的,而不是在与清单文件中的模式匹配的每个页面上。
2021-05-14 01:42:27

更新:

就脚本顺序而言,在第一个脚本之后执行第二个脚本会更准确,result是选项卡列表中脚本执行结果的数组。

chrome.tabs.executeScript(null, {file:'js/jquery-2.1.1.min.js'}, function(result){
    chrome.tabs.executeScript(null, {file:'js/myscript.js'});
});

老的:

在您的脚本之后注入 Jquery 将能够在您的脚本中访问 Jquery。

chrome.tabs.executeScript(null, {file:'js/jquery-2.1.1.min.js'});
chrome.tabs.executeScript(null, {file:'js/myscript.js'});

你必须对如何在描述的脚本应该注入更多的控制这里特别是allFrames,如果你想将脚本到文档中的所有帧属性是非常重要的。忽略它只会注入顶部框架。由于其他答案中未提及它,因此您猜它对您有帮助。脚本通常可以通过添加其描述体现注入这里

@Teepeemm 是的,这将是正确的解决方案。我会更新答案。
2021-04-19 01:42:27
是的,但是您应该使用第一个的回调来注入第二个。否则,它们可能会以错误的顺序完成执行,这将很难调试。
2021-04-21 01:42:27

由于我有很多具有很多依赖项的脚本,因此我使用了一个带有concatenateInjection三个参数的函数

//id: the tab id to pass to executeScript
//ar: an array containing scripts to load ( index order corresponds to execution order)
//scrpt (opzional): the last script to execute (if not provided, than the last script is the last insert in previous array)

function concatenateInjections(id, ar, scrpt){
  var i = ar.length;
  var idx = 0;

  function inject(idx){
    idx++;
    if(idx <= i){
      var f = ar[idx-1];
      chrome.tabs.executeScript(id, { file: f }, function() {
          inject(idx);
      });
    }else{
      if(typeof scrpt === 'undefined') return;
      chrome.tabs.executeScript(id, { file: scrpt });
    }
  }
  inject(idx);
}

和用法示例:

// id is tab id

// sources: first execute jquery, than default.js and anime.js in the end
var def = [
  "lib/jquery-1.11.3.min.js", 
  "lib/default.js", 
  "injection/anime.js"
];

// run concatenate injections
concatenateInjections(id, def);

认为这可能有用。

更新

带有 concat 和闭包的版本(更美观):

function concatenateInjections(id, ar, scrpt){

  if( typeof scrpt !== 'undefined' ) ar = ar.concat([scrpt]);

  var i = ar.length;
  var idx = 0 ;

  (function (){
    var that = arguments.callee;
    idx++;
    if(idx <= i){
      var f = ar[idx-1];
      chrome.tabs.executeScript(id, { file: f }, function(){ that(idx);} );
    }
  })();

}
因为如果有几个具有相同依赖项的脚本,那么我可以为此依赖定义一个数组“ar”,并且只为每次调用“concatenateInject”更改 scrpt 参数。我很懒;-)
2021-04-26 01:42:27
我已经ar.concat(...) 按照@Xan 的建议使用 a 进行了更新无论如何我更喜欢维护scrpt参数,所以我不必写myarray.concat('str')concatenateInjections(). 记住:我很懒:-)
2021-04-27 01:42:27
没关系; 这是可用的代码。我的意思是像concatenateInjections(id, ar.concat(script))您提出的用例一样使用它并将其保留为 2 个参数。
2021-05-03 01:42:27

任何时候你想动态插入 jQuery,我推荐这个脚本

我个人有一个 Chrome 自定义搜索“ $”,它替换$

javascript:
var jq = document.createElement('script');
jq.onload = function(){};
jq.src = "https://code.jquery.com/jquery-2.1.1.min.js";
document.querySelector('head').appendChild(jq);

javascript: 只是从 url 栏运行 javascript 的方法

about:blank当我试图快速模拟一些 css 情况时,我在我的页面上使用它