从Chrome扩展在页面中注入Javascript:并发性问题?
我正在参与Chrome扩展的开发 在某些时候,我们需要运行一些静态的非生成代码,这些代码必须在页面的上下文中运行,而不是在扩展的上下文中运行 对于简单脚本,使用从Chrome扩展在页面中注入Javascript:并发性问题?,javascript,jquery,google-chrome,google-chrome-extension,Javascript,Jquery,Google Chrome,Google Chrome Extension,我正在参与Chrome扩展的开发 在某些时候,我们需要运行一些静态的非生成代码,这些代码必须在页面的上下文中运行,而不是在扩展的上下文中运行 对于简单脚本,使用$.getScript(chrome.extension.getURL(..))或者script=document.createElement('script');,都没有问题。。。document.body.appendChild(脚本) 对于更复杂的脚本,我们有时需要包含jquery本身,或者其他一些脚本定义(因为依赖关系) 不过,在
$.getScript(chrome.extension.getURL(..))
或者script=document.createElement('script');,都没有问题。。。document.body.appendChild(脚本)代码>
对于更复杂的脚本,我们有时需要包含jquery本身,或者其他一些脚本定义(因为依赖关系)
不过,在后一种情况下,尽管Javascript被认为是单线程的,但在运行依赖脚本时,JQuery似乎并没有完全解析,这导致了以下问题
Uncaught ReferenceError: $ is not defined
假设JScript是单线程的,我错了吗?
当脚本之间存在依赖关系时,在页面中插入脚本的正确方法是什么?(例如,脚本X使用脚本Y中定义的函数)在DOM中添加带有src
属性的script
元素并不意味着脚本已实际加载并准备好使用。您将需要监视脚本实际加载的时间,之后可以像平常一样开始使用jQuery
你可以这样做:
var script = doc.createElement("script");
script.src = url;
/* if you are just targeting Chrome, the below isn't necessary
script.onload = (function(script, func){
var intervalFunc;
if (script.onload === undefined) {
// IE lack of support for script onload
if( script.onreadystatechange !== undefined ) {
intervalFunc = function() {
if (script.readyState !== "loaded" && script.readyState !== "complete") {
window.setTimeout( intervalFunc, 250 );
} else {
// it is loaded
func();
}
};
window.setTimeout( intervalFunc, 250 );
}
} else {
return func;
}
})(script, function(){
// your onload event, whatever jQuery etc.
});
*/
script.onload = onreadyFunction; // your onload event, whatever jQuery etc.
document.body.appendChild( script );
您可以对脚本使用onload事件
function addScript(scriptURL, onload) {
var script = document.createElement('script');
script.setAttribute("type", "application/javascript");
script.setAttribute("src", scriptURL);
if (onload) script.onload = onload;
document.documentElement.appendChild(script);
}
function addSecondScript(){
addScript(chrome.extension.getURL("second.js"));
}
addScript(chrome.extension.getURL("jquery-1.7.1.min.js"), addSecondScript);
成功了。我编写了一个链接机制,但是使用onload属性可以实现所需的功能。谢谢