【问题标题】:window onload event fails in ChromeChrome 中的窗口加载事件失败
【发布时间】:2010-10-08 09:14:20
【问题描述】:

我正在从 javascript 添加一些 <script/> 标签来加载一些库(例如 jquery)。加载所有库后,我执行主代码。为了等到一切准备就绪,我使用类似于this answer 中的解决方案(在网上找到)。

现在,故事:http://jsfiddle.net/EH84z/

function load_javascript(src) {
    var a = document.createElement('script');
    a.type = 'text/javascript';
    a.src = src;
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(a, s);
}

load_javascript('http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js');

function addEvent(elm, evType, fn, useCapture) {
    //Credit: Function written by Scott Andrews
    //(slightly modified)
    var ret = 0;

    if (elm.addEventListener) {
        ret = elm.addEventListener(evType, fn, useCapture);
    } else if (elm.attachEvent) {
        ret = elm.attachEvent('on' + evType, fn);
    } else {
        elm['on' + evType] = fn;
    }

    return ret;
}

addEvent(window, "load", function() {
    console.log(window.jQuery + '  ' + window.$);
    $(document);
}, false);

它在 Firefox 中运行良好,但在 Chrome 中经常失败。每次我按下 jsfiddle 的“运行”按钮时,都会在加载 JQuery 之前执行回调,从而在 Chrome 控制台中给出错误。

这是否意味着我严重滥用addEventListener?如果是,它的正确用途是什么?我如何真的等到所有脚本都加载完毕?

谢谢!
PS 还没有在任何其他浏览器中测试过,所以如果它在其他地方失败,请评论。

编辑
如果我在测试前等待一秒钟(使用setTimout),成功率会增加到 100%。一个例子http://jsfiddle.net/EH84z/1/

【问题讨论】:

  • 只是好奇,您为什么要尝试动态加载框架?
  • @Nick 这是人们在他们的页面中插入的一个小部件。我可以给他们一些 script 标签并告诉他们将它们放入 head 元素中,但我认为当一切都发生在引擎盖下时,它不会让用户感到困惑。
  • 听起来你遇到了这个错误dev.jquery.com/ticket/4196
  • 如果 jQuery 已经在别处加载了怎么办?再次包含它会吹走他们拥有的任何插件....有时依赖项(如 大多数 jQuery 插件指定)是一个更好的选择。
  • @Nick 如果它已经存在,我不会再次加载它。但是我会检查依赖机制,谢谢。

标签: javascript jquery google-chrome onload


【解决方案1】:

您必须将 load 事件附加到 jQuery 脚本标签,而不是 window 对象。

试试这个:

function load_javascript(src) {
    var a = document.createElement('script');
    a.type = 'text/javascript';
    a.src = src;
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(a, s);

    // attach it to the script tag
    addEvent(a, "load", function() {
        console.log(window.jQuery + '  ' + window.$);
        $(document);
    }, false);
}

【讨论】:

  • 只是在查找脚本加载事件。你打败了我。 +1
  • 先附上事件再设置src属性有区别吗?
  • +1,谢谢!我当然可以为每个脚本/链接标签使用一个事件监听器。但是还有另一个问题:窗口的“加载”事件有什么用?它在很多地方都提到过(例如,我链接的答案)。那它有什么作用呢?
  • @Nikita:当所有资源(文档、对象、图像、css等)都完成渲染时,窗口对象上的加载事件被触发...... HTML中的......不是您动态添加的那些。当窗口触发加载事件时,您可能需要调用load_javascript()...在加载 DOM 之前,您无法操作它。
猜你喜欢
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 2016-04-16
  • 2023-03-24
相关资源
最近更新 更多