событие загрузки окна не выполняется в Chrome - PullRequest
2 голосов
/ 08 октября 2010

Я добавляю некоторые теги <script/> из javascript для загрузки некоторых библиотек (например, jquery).Когда все библиотеки загружены, я выполняю основной код.Чтобы подождать, пока все не будет готово, я использую решение, аналогичное тому, которое есть в в этом ответе (найдено в Интернете).

Теперь история: 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 Еще не тестировал его в других браузерах, поэтому, пожалуйста, прокомментируйте, если он не работает где-то еще.

edit
если яподождите одну секунду (используя setTimout) перед тестированием, вероятность успеха увеличивается до 100%.Пример http://jsfiddle.net/EH84z/1/

1 Ответ

4 голосов
/ 08 октября 2010

Вы должны прикрепить событие 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);
}
...