Проверка на существование файла в IE с помощью readyState
Привет.
Есть код, который динамически подключает другие срипты: function loadScripts(src,callback){ var script = document.createElement("script"); script.src = src; script.onload = script.onreadystatechange = function(){ if ((!this.readyState || this.readyState == "loaded" || this.readyState == "complete")) { script.onreadystatechange = script.onload = null; callback(); } }; var head = document.getElementsByTagName("head")[0]; head.appendChild(script); } Передадим скрипту, файл blahblah.js которого не существует: loadScripts('blahblah.js',function(){alert('works!')}); IE (тестировал на версиях: 8 и 6), с удовольствием повесил и выполнил callback на несуществующем файле! Проверил состояние readyState, вывел COMPLETE. В других, нормальных браузерах, все работает. Проблема только с IE. Какие есть варианты, заставить IE понимать, что файл не загрузился и callback вызывать не нужно. |
Не сталкивался с такой проблемой, но первое, что приходит голову - это сделать callback в самом загружаемом скрипте:)
|
я могу лишь такой вариант предложить:
function loadScripts( src, callback ) { var req = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); req.onreadystatechange = function() { if ( this.readyState == 4 && this.status == 200 ) { var script = document.createElement("script"); script.onload = script.onreadystatechange = function( e ){ if ( ( !this.readyState || this.readyState == "loaded" || this.readyState == "complete" ) ) { this.onreadystatechange = this.onload = null; callback(); } }; script.src = src; var head = document.getElementsByTagName( "head" )[ 0 ]; head.appendChild( script ); } } req.open( "GET", src, true ); req.send( null ); }Другого для ие не придумать увы |
devote,
Проверять с помощью AJAX в принципе не плохая идея конечно. Вот если бы он был еще кроссдоменным! А так, проверять файлы только в пределах своего домена... IE в очередной раз показал, ху из ху! |
devote, спасиб!
|
гугл помагае
var script= document.createElement('script'); script.type= 'text/javascript'; script.onreadystatechange= function () { if (this.readyState == 'complete') helper(); } script.onload= helper; script.src= 'helper.js'; document.getElementsByTagName('head')[0].appendChild(script); ready states : Цитата:
|
melky,
Я это знаю. Проблема в том, что следующий код, выдаст в IE "Callback work!" пытаясь подключить несуществующий файл: nonexistentscript.js Состояние readyState: complete var helper = function(){ alert('Callback work!'); } var script= document.createElement('script'); script.type= 'text/javascript'; script.onreadystatechange= function () { if (this.readyState == 'complete') helper(); } script.onload= helper; script.src= 'nonexistentscript.js'; document.getElementsByTagName('head')[0].appendChild(script); |
melky,
Все эти стейты годятся для нормальных браузеров, для ИЕ это не выход) |
единственный вариант, это если ты знаешь имя функции/метода который должен быть в загружаемом файле, тогда можно просто сделать проверку на его существование, типа:
var script = document.createElement("script"); script.onload = script.onreadystatechange = function( e ){ if ( ( !this.readyState || this.readyState == "loaded" || this.readyState == "complete" ) ) { this.onreadystatechange = this.onload = null; if ( window['имя того метода или функции'] ) { callback(); } } }; script.src = src; var head = document.getElementsByTagName( "head" )[ 0 ]; head.appendChild( script ); |
мне вообще чудно такое использование
|
Часовой пояс GMT +3, время: 05:38. |