动态向页面添加脚本标记时,JavaScript 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

我正在开发一个bookmarklet,它需要在页面上加载特定版本的jQuery。当我必须动态插入jQuery脚本标记以满足bookmarklet的要求时,我希望在执行任何需要jQuery的函数之前,等待脚本标记上的onload或onreadystatechange事件

由于某些原因,onload和/或onreadystatechange事件不会触发。你知道我做错了什么吗

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);
}