Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Проверка на существование файла в IE с помощью readyState (https://javascript.ru/forum/events/20424-proverka-na-sushhestvovanie-fajjla-v-ie-s-pomoshhyu-readystate.html)

Kotakota 07.08.2011 21:08

Проверка на существование файла в 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 вызывать не нужно.

kobezzza 08.08.2011 11:08

Не сталкивался с такой проблемой, но первое, что приходит голову - это сделать callback в самом загружаемом скрипте:)

devote 09.08.2011 06:21

я могу лишь такой вариант предложить:
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 );
}
Другого для ие не придумать увы

Kotakota 09.08.2011 07:39

devote,
Проверять с помощью AJAX в принципе не плохая идея конечно.
Вот если бы он был еще кроссдоменным! А так, проверять файлы только в пределах своего домена...
IE в очередной раз показал, ху из ху!

Kotakota 09.08.2011 07:42

devote, спасиб!

melky 09.08.2011 08:38

гугл помагае
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 :

Цитата:

0 uninitialized
1 loading
2 loaded
3 interactive
4 complete

Kotakota 09.08.2011 09:16

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);

devote 09.08.2011 11:27

melky,
Все эти стейты годятся для нормальных браузеров, для ИЕ это не выход)

devote 09.08.2011 11:36

единственный вариант, это если ты знаешь имя функции/метода который должен быть в загружаемом файле, тогда можно просто сделать проверку на его существование, типа:

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 );

melky 09.08.2011 11:40

мне вообще чудно такое использование


Часовой пояс GMT +3, время: 05:38.