代码之家  ›  专栏  ›  技术社区  ›  Nikita Rybak

window onload事件在chrome中失败

  •  2
  • Nikita Rybak  · 技术社区  · 15 年前

    我添加一些 <script/> 标记从javascript加载一些库(例如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/

    1 回复  |  直到 12 年前
        1
  •  4
  •   Luca Matteis    15 年前

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