Я перестраиваю свой модуль ленивого загрузчика для приема асинхронных запросов, но у меня БОЛЬШАЯ проблема:
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 из Интернета)
резюмируя варианты, кажется, следующее:
Надеюсь, это не так уж и много! Спасибо.