Проверка на существование файла в 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 );
|
мне вообще чудно такое использование
|
Цитата:
|
что-то типа Bash, или серверки, типа php
|
Цитата:
melky, серверная сторона, для этого случая - изврат. :-? melky, devote - спасибо большое за дельные советы! |
msie в при загрузке скрипта изменяет readyState на loading->interactive->loaded. Если статус interactive пропущен - скрипт не загружен. В версии ie 8 и старше, если файл не существует, readyState остается loading.
function loadScripts(src,callback)
{
var script = document.createElement("script");
script.src = src;
script.ieCheck = false;
script.onreadystatechange = function()
{
if (this.readyState == 'interactive') this.ieCheck = true;
};
script.onload = script.onreadystatechange = function()
{
if ((!this.readyState || ((this.readyState == "loaded" || this.readyState == "complete") && this.ieCheck)))
{
script.onreadystatechange = script.onload = null;
callback();
}
};
document.getElementsByTagName("head")[0].appendChild(script);
}
|
| Часовой пояс GMT +3, время: 13:32. |