загрузка из внешнего файла js - PullRequest
1 голос
/ 16 февраля 2009

Я пишу js-скрипт, который люди добавят на свой веб-сайт, добавив одну строку кода в заголовок или конец части тела своего HTML.

У меня вопрос, как сделать загрузку прямо на внешнем js-файле. Будет ли работать код ниже? Не может ли он работать после загрузки документа и пропустить событие onload?

function c_onload () {  alert ('onload'); }

if (window.attachEvent) {window.attachEvent('onload', c_onload);}
else if (window.addEventListener) {window.addEventListener('load', c_onload, false);}
else {document.addEventListener('load', c_onload, false);} 

(я не могу использовать Jquery или любую другую библиотеку)

Ответы [ 3 ]

4 голосов
/ 16 февраля 2009

Каков ваш последний else -класс

else {document.addEventListener('load', c_onload, false);

для? Это довольно бесполезно, имхо.

Следующее должно быть кросс-браузерным решением: сначала проверяется addEventListener(), затем attachEvent() и возвращается к onload = ...

function chain(f1, f2) {
    return typeof f1 !== 'function' ? f2 : function() {
        var r1 = f1.apply(this, arguments),
            r2 = f2.apply(this, arguments);
        return typeof r1 === 'undefined' ? r2 : (r1 && r2);
    };
}

function addOnloadListener(func) {
    if(window.addEventListener) 
        window.addEventListener('load', func, false);
    else if(window.attachEvent)
        window.attachEvent('onload', func);
    else window.onload = chain(window.onload, func);
}

Кроме того, что сказал кгианнакакис

Причина в том, что браузеры по-разному обрабатывают событие onLoad.

не соответствует действительности: все основные браузеры обрабатывают window.onload одинаково, то есть функция слушателя выполняется после загрузки внешних ресурсов - , включая ваш внешний скрипт -. Проблема заключается в DOMContentLoaded - вот где в игру вступают хаки с doScroll(), defer, onreadystatechange и всем остальным, что кто-то приготовил.


В зависимости от вашей целевой аудитории вы можете либо отказаться от резервного кода, либо даже использовать его исключительно. Мой голос должен был бы быть отброшен.

2 голосов
/ 16 февраля 2009

Боюсь, что если вы не можете использовать jQuery или какую-либо другую библиотеку, вам нужно воспроизвести как можно больше их функциональности. Причина в том, что браузеры по-разному обрабатывают событие onLoad.

Я рекомендую вам загрузить код jQuery и посмотреть, как реализована функция documentready.

0 голосов
/ 16 февраля 2009

Событие onLoad должно выполняться, когда загружен элемент, к которому он прикреплен. Но некоторые браузеры * неверно истолковывают это как «beforeload» или «иногда во время загрузки», поэтому самый безопасный вариант, чтобы убедиться, что что-то запускается после загрузки всего html, - это добавить вызов функции в нижней части HTML-источника, например так: :

    ...
        <script type="text/javascript">
            c_onload();
        </script>
    </body>
</html>

(* по крайней мере, некоторые версии Safari для Windows, которые я считаю, имеют эту проблему)

...