Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.08.2011, 21:08
Аспирант
Отправить личное сообщение для Kotakota Посмотреть профиль Найти все сообщения от Kotakota
 
Регистрация: 12.07.2011
Сообщений: 71

Проверка на существование файла в 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 вызывать не нужно.
Ответить с цитированием
  #2 (permalink)  
Старый 08.08.2011, 11:08
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Не сталкивался с такой проблемой, но первое, что приходит голову - это сделать callback в самом загружаемом скрипте
__________________
kobezzza
code monkey
Ответить с цитированием
  #3 (permalink)  
Старый 09.08.2011, 06:21
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

я могу лишь такой вариант предложить:
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 );
}
Другого для ие не придумать увы
Ответить с цитированием
  #4 (permalink)  
Старый 09.08.2011, 07:39
Аспирант
Отправить личное сообщение для Kotakota Посмотреть профиль Найти все сообщения от Kotakota
 
Регистрация: 12.07.2011
Сообщений: 71

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

Последний раз редактировалось Kotakota, 09.08.2011 в 07:42.
Ответить с цитированием
  #5 (permalink)  
Старый 09.08.2011, 07:42
Аспирант
Отправить личное сообщение для Kotakota Посмотреть профиль Найти все сообщения от Kotakota
 
Регистрация: 12.07.2011
Сообщений: 71

devote, спасиб!
Ответить с цитированием
  #6 (permalink)  
Старый 09.08.2011, 08:38
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

гугл помагае
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
Ответить с цитированием
  #7 (permalink)  
Старый 09.08.2011, 09:16
Аспирант
Отправить личное сообщение для Kotakota Посмотреть профиль Найти все сообщения от Kotakota
 
Регистрация: 12.07.2011
Сообщений: 71

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

Последний раз редактировалось Kotakota, 09.08.2011 в 09:18.
Ответить с цитированием
  #8 (permalink)  
Старый 09.08.2011, 11:27
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

melky,
Все эти стейты годятся для нормальных браузеров, для ИЕ это не выход)
Ответить с цитированием
  #9 (permalink)  
Старый 09.08.2011, 11:36
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

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

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 );
Ответить с цитированием
  #10 (permalink)  
Старый 09.08.2011, 11:40
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка файла с помощью JavaScript Kipetcoff Internet Explorer 4 08.02.2011 12:20
Загрузка файла в массив строк с помощью AJAX malcomoffice AJAX и COMET 2 08.06.2010 18:02
Проверка наличия логина в БД при регистрации, с помощью ajax storng Общие вопросы Javascript 4 09.04.2010 20:24
Проверка актуальности URL удаленного файла с помощью JavaScript - реально? LAPSuha Оффтопик 1 25.08.2009 09:31
Проверка размера файла Kakao Events/DOM/Window 10 27.04.2009 12:34