обработчик onload для тега script в Internet Explorer

Я использовал эту функцию для прикрепления обработчика onload к тегу скрипта, кажется, это рекомендуемый способ через Интернет.
Тем не менее, это не работает в Internet Explorer, если страница уже загружена (проверено в IE 8). Вы можете видеть, что он работает в обычных браузерах (выдает предупреждение при загрузке скрипта).

Я что-то упускаю?
Спасибо


person Nikita Rybak    schedule 30.01.2011    source источник
comment
onload не поддерживается в IE8 и ниже. Он работает в стандартном режиме IE9.   -  person EricLaw    schedule 31.01.2011
comment
@EricLaw Я не понимаю, что вы имеете в виду, window.attachEvent ('onload', fn); работал у меня до сих пор (IE 8). Это также упоминается в MSDN.   -  person Nikita Rybak    schedule 31.01.2011
comment
@NikitaRybak Я также пытаюсь реализовать способ загрузки jquery в скрипт (если он еще не загружен), а затем вызвать функцию при ее загрузке. onload для скриптов в ie к сожалению нет. Вы нашли способ сделать это?   -  person Etherealone    schedule 17.08.2012
comment
Вы можете найти это полезным при загрузке скриптов с async = false. stackoverflow.com/a/13031185/325852   -  person czerasz    schedule 23.10.2012


Ответы (2)


Вам следует вызвать jQuery.getScript, который сделает именно то, что вы ищете.

ИЗМЕНИТЬ. Вот соответствующий исходный код из jQuery:

var head = document.getElementsByTagName("head")[0] || document.documentElement;
var script = document.createElement("script");
if ( s.scriptCharset ) {
    script.charset = s.scriptCharset;
}
script.src = s.url;

// Handle Script loading
    var done = false;

// Attach handlers for all browsers
script.onload = script.onreadystatechange = function() {
    if ( !done && (!this.readyState ||
            this.readyState === "loaded" || this.readyState === "complete") ) {
        done = true;
        jQuery.handleSuccess( s, xhr, status, data );
        jQuery.handleComplete( s, xhr, status, data );

        // Handle memory leak in IE
        script.onload = script.onreadystatechange = null;
        if ( head && script.parentNode ) {
            head.removeChild( script );
        }
    }
};

// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
// This arises when a base node is used (#2709 and #4378).
head.insertBefore( script, head.firstChild );
person SLaks    schedule 30.01.2011
comment
На самом деле не сработает, потому что jquery изначально недоступен: мне нужно загрузить его вот так. Но я проверю исходники и посмотрю, работает ли это в IE. +1 за интересную ссылку, спасибо! - person Nikita Rybak; 31.01.2011
comment
Отличный ответ, спасибо, вам не нужно использовать jQuery, чтобы учиться на этом совершенно правильном подходе, а затем писать что-то подобное. :) - person Eugene Kuzmenko; 08.10.2012
comment
Я думаю, что jQuery.handleSuccess (s, xhr, status, data); jQuery.handleComplete (s, xhr, статус, данные); вероятно, не обязательно и вызовет ошибки, если будет использоваться дословно - person Ben West; 01.11.2012
comment
Просто обратите внимание на то, что IE9 + поддерживает как script.onload, так и script.onreadystatechange (bit.ly/18gsqtw), поэтому оба события будут запущены (это 2 вызова), поэтому необходимо сделать это. Полезно помнить, если вам нужно обернуть это в модуль, чтобы облегчить загрузку нескольких скриптов. - person James Wilkins; 19.10.2013
comment
вы можете найти этот же код здесь готов к использованию (без частей jQuery) - person Luis Siquot; 22.09.2014
comment
Интересно, что jQuery назначает атрибут src перед вставкой скрипта в head. Пример Mozilla importScript () делает это в обратном порядке. Можно было бы предположить, что последовательность важна, но, видимо, нет, поскольку работают обе функции. - person Roberto; 21.04.2015
comment
Другая проблема - это кеш, поэтому может потребоваться временная метка для ссылки. - person aboutqx; 15.06.2016

У меня также были проблемы с script.onload = runFunction; в IE8.

Я попробовал jQuery.getScript, и он отлично сработал для моих нужд. Единственный недостаток - дождаться загрузки jQuery перед добавлением скрипта.

Однако, поскольку мои функции обратного вызова в любом случае очень сильно используют jQuery, я считаю это чрезвычайно приемлемым и очень незначительным недостатком, поскольку он создает очень простое в использовании кросс-браузерное решение.

Обновление:

Вот способ сделать это без использования jQuery:

(модифицированное решение от: https://stackoverflow.com/a/13031185/1339954)

var url = 'http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js';
var headID = document.getElementsByTagName("head")[0];
var script = document.createElement('script');
script.type='text/javascript';
script.src=url;

//for nonIE browsers
script.onload=function(){
        addVideo();
    }

 //for IE Browsers
 ieLoadBugFix(script, function(){
     addVideo();}
 );

function ieLoadBugFix(scriptElement, callback){
        if (scriptElement.readyState=='loaded' || scriptElement.readyState=='completed') {
             callback();
         }else {
             setTimeout(function() {ieLoadBugFix(scriptElement, callback); }, 100);
         }


 }

headID.appendChild(script);
person ngChris    schedule 15.03.2013
comment
Похоже, jQuery справляется без опроса. Попробуйте onreadystatechange вместо установки тайм-аута - person Dan; 06.11.2014
comment
Функция ieLoadBugFix отлично справляется со своей задачей. Он это проверил. Я в восторге от того, как stackoverflow помог с решением, предложенным 8 лет назад. Это потрясающе - person Hello Universe; 24.02.2021