скрипт onload / onerror с проблемами IE (для ленивой загрузки)

Я перестраиваю свой модуль ленивого загрузчика для приема асинхронных запросов, но у меня БОЛЬШАЯ проблема:
Internet Explorer не поддерживает скрипт. onload / onerror !!!

Старый скрипт выполнял глобальную оценку целевого источника скрипта, прочитанного с помощью вызова синхронизации ajax, он работает очень хорошо, кроссбраузерно, и я могу сделать его асинхронным, редактируя 1 переменную, но это очень сложно отладить (ВСЕ исходный код выполняется в одной строке, и браузер не дает много информации об ошибках, разделение кода на строку с помощью регулярного выражения НЕВОЗМОЖНО, потому что js имеют блоки с бесконечной глубиной, а регулярное выражение просто не подходит для этого).

Это код, который я использую для создания скрипта (классический):

var script = document.createElement('script');
script.type = 'text/javascript';
script.src =name;
script.name =name;
script.async = true;
script.onload=<my_onload_code>;
script.onerror=<my_onerror_code>;

он не будет работать в IE, потому что он не поддерживает onload и onerror со скриптом;
приведенный ниже код является исправлением, но работает только в том случае, если скрипт не является асинхронным

if(script.onreadystatechange!==undefined)//only IE T_T
            script.onreadystatechange = function() {
                    if (script.readyState == 'loaded')//ERROR LOADING
                        <my_onerror_code>;
                    else
                    if(script.readyState == 'complete')//loaded
                        <my_onload_code>;

            };

. Я могу тестировать его каждые X миллисекунд, пока скрипт не загрузится, но это уродливое решение, и я хочу его избежать.

РЕДАКТИРОВАТЬ: это код, который я пытался проверять каждые X мс, если скрипт загружен, это не так уж плохо и работает лучше, чем ajax; проблема в том, что я не могу знать, загружен ли скрипт с успехом или с ошибкой (onload или onerror).

var script = document.createElement('script');
script.type = 'text/javascript';
script.src =name;
script.name =name;
script.async = true;

    script.onload=function(){Lazy_loader.onload(this);};
    script.onerror=function(){Lazy_loader.onerror(this);};

    if(script.onreadystatechange!==undefined){//ie fix T_T 
        script.timer=setInterval(function(){
                    if (script.readyState == 'loaded' || script.readyState == 'complete')}//ERROR LOADING

                        if(LOADED???)//loaded
                            Lazy_loader.onload(script);
                        else
                            Lazy_loader.onerror(script);

                        clearInterval(script.timer);
                    }

                    },100);

    }

document.getElementsByTagName('head')[0].appendChild(script);

Я пытался использовать функции addEventListener / attachEvent, но, похоже, это не сработало (даже с использованием функций addEvent из Интернета)

резюмируя варианты, кажется, следующее:

  • Используйте AJAX и глобальный eval для загрузки скрипта (ад отладки)
  • Используйте AJAX и глобальный eval только с IE (может быть решением, я не использую IE)
  • Используйте AJAX и глобальный eval, только если скрипт содержит ошибки (мне нужно проверить проблемы с таймингом, потому что своим кодом я "имитирую" синхронный код, даже если вызов является асинхронным)
  • Тестируйте script.onreadystatechange (только в IE) каждый раз X, пока он не загрузится (УЖАСНО !!!)
  • Используйте window.onload: AVOID, он должен заряжать ВСЕ страницу, мне нужно вызывать его, когда запускается ТОЛЬКО один скрипт (подробности см. на конечной странице)
  • Добавьте код в источник каждого скрипта (ИЗБЕГАЙТЕ, как сказано на конечной странице)
  • исправьте скрипт .onload для IE (с использованием addEventListener / attachEvent?!?)


ОБРАТИТЕ ВНИМАНИЕ:
я не хочу использовать window.onload, потому что он запускается только тогда, когда ВСЕ страница загружена, мне нужно запустить его, когда n загружается только целевой сценарий (мой сценарий отложенной загрузки намного сложнее, поэтому, пожалуйста, не спрашивайте, почему);
Я НЕ ХОЧУ использовать ЛЮБУЮ стороннюю библиотеку (например, jquery, prototype и т. д.) ,
я даже не хочу редактировать целевой источник сценария (например, при использовании JSPON или добавлении сценария для предупреждения о загрузке сценария).

Надеюсь, это не так уж и много! Спасибо.

5
задан Plokko 15 August 2010 в 08:09
поделиться