当我处理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
}
这是我的background.js文件:
chrome.browserAction.onClicked.addListener(function(tab){
// No tabs or host permissions needed!
chrome.tabs.executeScript({
file: 'content.js'
});
});
最后,触发错误的文件: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');
}
};
});
根据我的理解,这发生了,因为JQuery没有加载。但是,我正在清单中正确加载它,jquery.js也是在清单内容脚本中调用的第一个文件。请帮我调试。谢谢!
答案 0 :(得分:13)
当jQuery.js加载之前调用jQuery的脚本加载时会发生这种情况。在问题提交者给出的示例中,后台在内容脚本之前加载,内容脚本在后台脚本调用jQuery之后加载jQuery。这个例子可以通过让后台脚本加载jQuery来解决,如下所示:
"background": {
"scripts": ["jquery-2.0.2.js", "jquery.Jcrop.js", "background.js"],
"persistent": false
},
请记住清单中列出的js文件按它们出现的顺序加载。例如,让我们说你有一个文件&#34; script.js&#34;,其中包含:
console.log($('#elementID'));
如果你写这样的清单(错误),你将收到错误&#34; $未定义&#34;:
"content_scripts": [
{
"js": [
"script.js",
"jquery.js" ]
}
]
将清单更改为此(右)将修复错误:
"content_scripts": [
{
"js": [
"jquery.js",
"script.js" ]
}
]
请注意&#34; jquery.js&#34;现在先于&#34; script.js&#34;因此首先加载。
这个问题似乎是间歇性的,因为两个脚本几乎同时加载。如果你更改脚本以便调用jQuery低于其他一些javascript命令,那么执行其他命令所花费的时间可能足以让jQuery.js完成加载。例如,如果你以错误的方式编写了清单,你也可以通过更改script.js文件从技术上修复错误:
var t = setTimeout(function(){
console.log($('#elementID'));
}, 1000);
1秒延迟使jQuery.js有足够的时间加载,但是,这显然不是理想的解决方案!
答案 1 :(得分:1)
我不知道它是如何工作的,但不知何故,当我将JQuery更改为最小化版本时,它现在可以正常工作。
答案 2 :(得分:0)
之所以发生这种情况,是因为您要在jQuery文件之前调用脚本。
正确的是这样:
{
"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","yourscript.js"],
"css": ["jquery.Jcrop.min.css"]
}],
"browser_action": {
"default_title": "Snip this page"
},
"manifest_version": 2
}
答案 3 :(得分:-3)
某处发生了冲突。通过将$
的所有实例替换为jQuery
来解决此问题。