动态向页面添加脚本标记时,JavaScript onload/onreadystatechange不会触发
我正在开发一个bookmarklet,它需要在页面上加载特定版本的jQuery。当我必须动态插入jQuery脚本标记以满足bookmarklet的要求时,我希望在执行任何需要jQuery的函数之前,等待脚本标记上的onload或onreadystatechange事件 由于某些原因,onload和/或onreadystatechange事件不会触发。你知道我做错了什么吗动态向页面添加脚本标记时,JavaScript onload/onreadystatechange不会触发,javascript,events,Javascript,Events,我正在开发一个bookmarklet,它需要在页面上加载特定版本的jQuery。当我必须动态插入jQuery脚本标记以满足bookmarklet的要求时,我希望在执行任何需要jQuery的函数之前,等待脚本标记上的onload或onreadystatechange事件 由于某些原因,onload和/或onreadystatechange事件不会触发。你知道我做错了什么吗 var tag = document.createElement("script"); tag.type = "text/ja
var tag = document.createElement("script");
tag.type = "text/javascript";
tag.src = "http://ajax.microsoft.com/ajax/jquery/jquery-" + version + ".min.js";
tag.onload = tag.onreadystatechange = function () {
__log("info", "test");
__log("info", this.readyState);
};
document.getElementsByTagName('head')[0].appendChild(tag);
完整代码:您总是可以作弊,并将onload/onreadystatechange逻辑放入setTimeout(),指定1毫秒的持续时间。由于您将脚本元素插入DOM中,因此可以保证看到它在超时之前执行 示例代码:
var tag = document.createElement("script");
tag.type = "text/javascript";
tag.src = "http://ajax.microsoft.com/ajax/jquery/jquery-" + version + ".min.js";
document.getElementsByTagName('head')[0].appendChild(tag);
setTimeout(function(){
__log("info", "test");
}, 1);
对你来说可能太晚了,但我是这样绕过这个问题的 基本上,它收集“$(document).ready(function(){})”和“$(function(){})”调用,并在jQuery完成加载后运行它们 我们没有使用onLoad,而是使用setInterval在将脚本标记添加到变量后等待变量jQuery成为函数
如果您同时使用这两个事件(tag.onload=tag.onreadystatechange),那么在IE9上它将被调用两次。请参阅,问题是我没有看到onreadystatechange被触发。我遇到的问题与jQuery无关。@spoon16:ah我误解了。在FF(2)、Chrome 4、IE6中为我工作。您是否尝试了
head.insertBefore(tag,head.firstChild)
而不是appendChild
?外部页面上的标记可能与此脚本包含样式相冲突。或者您的浏览器可能只是缓存了文件?在您的\u日志
函数中,这一行将中断:控制台[type]。应用(null,consoleArgs)
。您需要将控制台
对象本身作为第一个参数传递给.apply()
,否则将不会记录任何内容。@Cresent Fresh您的示例对我有效,但我现在不在我的开发机器上,因此在回家之前无法调试特定问题。你应该把这些东西都写进一个正确的答案,这样你就可以得到信用。
var $_i, $_r = [];
var $ = function(func){
if(typeof(func) == 'function'){ $_r.push(func); }
return{ ready: function(func){ $_r.push(func); } }
}
window.onload = function(){
var s = document.createElement('script');
s.setAttribute('type', 'text/javascript');
s.setAttribute('src', 'https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js');
document.getElementsByTagName("head")[0].appendChild(s);
$_i = setInterval(function(){
if(typeof(jQuery) == 'function'){
clearInterval($_i);
for(var i in $_r){
$_r[i]();
}
}
}, 100);
}