我正在参与Chrome扩展的开发。
在某些情况下,我们需要运行一些静态的非生成代码,这些代码必须在页面的上下文中运行,而不是在扩展的上下文中运行。
对于简单的脚本,使用$.getScript(chrome.extension.getURL(....))
或script = document.createElement('script'); ... document.body.appendChild(script);
都没有问题
对于更复杂的脚本,我们有时需要包含jquery本身,或者一些其他脚本定义(由于依赖关系)。
不过,在后一种情况下,尽管Javascript应该是单线程的,但在运行依赖脚本时,JQuery似乎并未完全解析,从而导致以下情况
Uncaught ReferenceError: $ is not defined
假设JScript是单线程的,我说错了吗?当脚本之间存在依赖关系时,在页面中插入脚本的正确方式是什么?(例如,脚本X使用脚本Y中定义的函数)
发布于 2012-03-24 20:31:50
您可以对脚本使用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);
发布于 2012-03-24 20:16:31
在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 );
https://stackoverflow.com/questions/9851559
复制相似问题