Chrome扩展程序"$未定义"错误

cha*_*asi 9 javascript jquery google-chrome google-chrome-extension

当我处理我的chrome扩展时,我收到错误"$ is not defined".

这是我的清单文件:

   {
      "name": "X",
      "description": "Snip this page",
      "version": "2.0",
      "permissions": [
        "activeTab"
      ],
      "background": {
        "scripts": ["background.js"],
        "persistent": false
      },
      "content_scripts":[{
        "matches" : ["<all_urls>"],
        "js": ["jquery-2.0.2.js","jquery.Jcrop.js"],
        "css": ["jquery.Jcrop.min.css"]
      }],
      "browser_action": {
        "default_title": "Snip this page"
      },
      "manifest_version": 2
    }
Run Code Online (Sandbox Code Playgroud)

这是我的background.js文件:

chrome.browserAction.onClicked.addListener(function(tab){
  // No tabs or host permissions needed!
  chrome.tabs.executeScript({
    file: 'content.js'
  });
});
Run Code Online (Sandbox Code Playgroud)

最后,触发错误的文件:content.js

console.log('1');
var jcropapi, boundx, boundy;
$('body').attr('id', 'target');
$(document).ready(function(){
    $('target').Jcrop();
    console.log('4');
    document.onkeydown = function(){
        if(window.event.keyCode==13){
            console.log('enter');
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

从我的理解,这发生了因为JQuery没有加载.但是,我正在清单中正确加载它,jquery.js也是在清单内容脚本中调用的第一个文件.请帮我调试.谢谢!

mat*_*hew 13

当jQuery.js加载之前调用jQuery的脚本加载时会发生这种情况.在问题提交者给出的示例中,后台在内容脚本之前加载,内容脚本在后台脚本调用jQuery之后加载jQuery.这个例子可以通过让后台脚本加载jQuery本身来修复,如下所示:

 "background": {
    "scripts": ["jquery-2.0.2.js", "jquery.Jcrop.js", "background.js"],
    "persistent": false
  },  
Run Code Online (Sandbox Code Playgroud)

还要记住清单中列出的js文件按它们出现的顺序加载.例如,假设您有一个文件"script.js",其中包含:

console.log($('#elementID'));
Run Code Online (Sandbox Code Playgroud)

如果您像这样(错误)编写清单,您将收到错误"$ is not defined":

"content_scripts": [
    {
        "js": [ 
            "script.js",
            "jquery.js" ]
    } 
]
Run Code Online (Sandbox Code Playgroud)

将清单更改为此(右)将修复错误:

"content_scripts": [
    {
        "js": [ 
            "jquery.js",
            "script.js" ]
    } 
]
Run Code Online (Sandbox Code Playgroud)

请注意,"jquery.js"现在位于"script.js"之前,因此首先加载.

这个问题似乎是间歇性的,因为两个脚本几乎同时加载.如果你更改脚本以便调用jQuery低于其他一些javascript命令,那么执行其他命令所花费的时间可能足以让jQuery.js完成加载.因此,例如,如果您以错误的方式编写清单,您还可以通过更改script.js文件从技术上修复错误,如下所示:

var t = setTimeout(function(){
     console.log($('#elementID'));
}, 1000);
Run Code Online (Sandbox Code Playgroud)

1秒的延迟使jQuery.js有足够的时间加载,但是,这显然不是理想的解决方案!


cha*_*asi 0

我不知道它是如何工作的,但不知何故,当我将 JQuery 更改为最小化版本时,它现在可以工作了。

  • 我猜你在清单文件中添加 jQuery 后没有重新加载扩展。内容脚本会自动重新加载。对 manifest.json 的更改仅在重新加载 Chrome 扩展程序后才会生效。 (2认同)