我尝试在我的Chrome扩展中使用jQuery和jQuery-UI。我尝试在每次创建新标签时在内容脚本对话框窗口中创建,但我一直得到:
Property '$' of object [object Window] is not a function
我想我在加载脚本时做错了什么。下面是我所得到的:
{
"name":"Sample",
"description":"This is a sample",
"manifest_version":2,
"version":"2",
"background":{
"scripts":["background.js"]
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["jquery-1.8.3.min.js","jquery-ui.js","client.js","myscript.js"]
"run_at":"document_end",
"all_frames": true
}
],
"web_accessible_resources": [
"client.js","jquery-1.8.3.min.js","jquery-ui.js"
],
"permissions": [
"unlimitedStorage",
"http://*/",
"<all_urls>",
"tabs"
]
}
myscript.js(内容脚本):
var ss = document.createElement('script');
ss.type = "text/javascript";
ss.src = chrome.extension.getURL('jquery-1.8.3.min.js');
ss.onload = function() {
ss.parentNode.removeChild(ss);
console.log("jquery-1.8.3.min.js loaded");
};
var ss_ui = document.createElement('script');
ss_ui.type = "text/javascript";
ss_ui.src = chrome.extension.getURL('jquery-ui.js');
ss_ui.onload = function() {
ss_ui.parentNode.removeChild(ss_ui);
console.log("jquery-ui.js loaded");
};
var s = document.createElement('script');
s.type = "text/javascript";
s.src = chrome.extension.getURL('client.js');
s.onload = function() {
s.parentNode.removeChild(s);
console.log("client.js loaded");
};
try{
(document.head||document.documentElement).appendChild(ss);
(document.head||document.documentElement).appendChild(ss_ui);
(document.head||document.documentElement).appendChild(s);
}catch(e){
console.log("exception in appendChild");
}
client.js(我在其中创建对话框)
try{
console.log("Starting to create tabel");
var layerNode= document.createElement('div');
layerNode.setAttribute('id','dialog');
layerNode.setAttribute('title','Basic dialog');
var pNode= document.createElement('p');
pNode.innerHTML = "This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.";
layerNode.appendChild(pNode);
document.body.appendChild(layerNode);
jq162 = jQuery.noConflict(true);
(function($){
$(document).ready(function() {
$("#dialog" ).dialog();
});
})(jq162);
}
catch(e){
console.log("script in page exception in appendChild"+e);
//alert(e);
}
当我在控制台中看到打印的顺序时,我得到:
Starting to create tabel client.js:2
script in page exception in appendChildTypeError: Cannot call method 'dialog' of null client.js:26
client.js loaded chrome-extension://mmoccjinakdjcmhjdjghhjnihbfkkgkp/myscript.js:24
jquery-1.8.3.min.js loaded chrome-extension://mmoccjinakdjcmhjdjghhjnihbfkkgkp/myscript.js:6
jquery-ui.js loaded
我做错了什么?
2条答案
按热度按时间cvxl0en21#
通常的免责声明,我真的不做jQuery...但我看到你的代码有一个明显的问题,所以给了它一个机会...
摆脱client.js,在你将它注入的文件添加到清单的内容脚本部分后,它就不再需要了。在你将它们添加到清单后,Chrome现在会为你注入它们。一旦你这样做了,它就开始工作了一半。
在那之后我注意到对话框出现了,但是没有图形/样式,所以你需要将css文件添加到清单的内容脚本部分来注入。现在有一些样式,但是控制台说它无法获得样式所需的图形文件。
我不知道从css文件引用extensions目录中包含的图形文件的最佳方法是什么,所以我只是将所有的图形转换为dataurl并将它们放入css文件中。
http://dataurl.net/#dataurlmaker
......去完成它。
现在我们有了一个好看的对话框。
manifest.json
jquery-ui-base64.css
https://gist.github.com/4193693
我觉得放在这里可能有点太大了。
client.js
编辑
使用chromes i18 n支持,我们可以更改css中图像的url,使它们指向我们扩展中的文件。
https://stackoverflow.com/a/8864212/189093
所以这...
url(images/ui-bg_flat_0_aaaaaa_40x100.png)
变成了
url(chrome-extension://__MSG_@@extension_id__/images/ui-bg_flat_0_aaaaaa_40x100.png)
路径不再是相对的,
__MSG_@@extension_id__
被替换为您的扩展名的ID。此外,所有以这种方式使用的图像都需要在mainfest的
web_accessible_resources
部分声明。所以,清单中的那部分最终看起来像这样(注意我取出了你在那里的三个,它们不再需要被包括在内,因为它们现在被扩展注入了)。
..我只包含了我需要的文件来让我的测试工作,你可能需要添加更多。检查脚本运行页面上的控制台,它会告诉你需要添加什么文件。
这里有一个链接到我的测试中使用的相同的CSS文件,其中URL更新为以这种方式工作…
https://gist.github.com/4195616
velaa5lx2#
当您调用
jQuery.noConflict
时,将不会定义$
变量。但是在
script.js
中,你在noConflict
之后调用了$(document)
。我想你在调用noConflict
之后忘记了一行(function($
。你必须把你的代码改成这样: