Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.05.2011, 10:43
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

каменное кеширование?
возник вопрос, почему почти везде делают так :

function xlmObj(){
                                
    try  { 
                              
        return new XMLHttpRequest();
                               
    } catch (m){
                                  
        try {
                              
            return new ActiveXObject("Msxml2.XMLHTTP");
                           
        } catch (e) {
                          
            try {
                         
                return new ActiveXObject("Microsoft.XMLHTTP");
                           
                } catch (E) {
                              
                    return ;
                                  
                            }
                    }
                }
}


если можно сделать по-другому, не вычисляя каждый раз ЭТО :


(function(window){
 
  if( !window.XMLHttpRequest ){
    

          window.XMLHttpRequest =  (function(){    
             try {   
                      return new ActiveXObject("Msxml2.XMLHTTP");
                 } 
            catch ( e ) {
                
                try {
                    
                       return new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    
                catch ( g ) { return new IFRAME_imitation(); }
                    
                        }       

    })()// func end.
          

  }

})(window)



а потом уже использовать XMLHttpRequest,как обычно. во всех браузерах

var a = XMLHttpRequest( ) ;

a.open('GET',url);

........



если это ифрейм-имитация, то во фрейме будет при open создаваться форма, при send отправляться. ну , это уже можно додумать.


и еще один вопрос.

в jQuery , можно посмотреть тут,например

по поиску // Fake xhr, в функции ajax, есть фейковый объект XMLHttpRequest

и метод аборт у него :

// Cancel the request
				abort: function( statusText ) {
					statusText = statusText || "abort";
					if ( transport ) {
						transport.abort( statusText );
					}
					done( 0, statusText );
					return this;
				}



обьясните пожалуйста,зачем создавать этот фейковый объект XMLHttpRequest.
Ответить с цитированием
  #2 (permalink)  
Старый 02.05.2011, 14:01
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

1. Дело вкуса. По сути, написано одно и то же.
2. jQuery спроектирован так, что он никогда не должен выдавать ошибок. Поэтому если браузер ну вообще никак не поддерживает аякс, для того, чтобы не менять логику, сделаем так, что он «типа» его поддерживает.

То есть, мы можем сделать так:
var myObj;
if (myObj = document.getElementById("my-object")){
	myObj.style.color = "red";
};

И присваивание произойдет только если элемент найден.

Или так:
(document.getElementById("my-object") || {"style": {}}).style.color = "red"

И присваивание произойдет в любом случае, но если объекта нет, значение присвоится и сразу же уйдет в небытие сборщику мусора.

Второй способ внешне похож на говнокод, но в случае, когда отсутствие объекта с id "my-object" — явление, скорее, аварийное, чем штатное, вполне себя оправдывает.

Последний раз редактировалось subzey, 02.05.2011 в 14:02. Причина: Очепятка
Ответить с цитированием
  #3 (permalink)  
Старый 02.05.2011, 15:15
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от melky
почему почти везде делают так
из-за невозможности использовать свойство prototype получаемого конструктора (точнее его использование становится бесполезным). Это неправильно с точки зрения ООП. По этой причине в ранних версиях PrototypeJs вместо "new Element" было "Element.create" и вместо "new Class" было "Class.create" (там еще есть примеры, например, тот же XMLHttpRequest по-прежнему добывается через "Ajax.getTransport"). Позже в MooTools это решили добавлением специальных методов, которые как бы создают видимость, что все нормально (по факту вручную дописывают методы созданному экземпляру). Еще позже PrototypeJs догнал по элементам и теперь можно писать "new Element", у создаваемых классов тоже появились нужные методы (точнее один: Class#addMethods), но видимо для совместимости оставили вызов через "Class.create" (или может чего еще не хватило для правильного ООП).

Последний раз редактировалось Riim, 02.05.2011 в 15:24.
Ответить с цитированием
  #4 (permalink)  
Старый 02.05.2011, 15:55
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Riim,
я что-то не понял ничего из того, что вы написали. Я уже давно везде использую подход, похожий на предложение melky и никаких проблем не наблюдаю.

UPD: хотя примерно понял, но кажется вы всё смешали в кучу.
Ответить с цитированием
  #5 (permalink)  
Старый 02.05.2011, 15:59
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Kolyaj
никаких проблем не наблюдаю
так я же и не пугаю проблемами, используйте дальше, все нормально .
Ответить с цитированием
  #6 (permalink)  
Старый 02.05.2011, 19:22
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Riim Посмотреть сообщение
из-за невозможности использовать свойство prototype получаемого конструктора (точнее его использование становится бесполезным).

Это неправильно с точки зрения ООП. По этой причине в ранних версиях PrototypeJs вместо "new Element" было "Element.create" и вместо "new Class" было "Class.create" (там еще есть примеры, например, тот же XMLHttpRequest по-прежнему добывается через "Ajax.getTransport").

я немножко не понял,о чем вы написали.

вы ведь о примере из jQuery объяснили?

но там ведь и не пахнет прототипами. там ведь использование методов-заглушек при отсутствии оных в объекте

...

спасибо Kolyaj за ссылку на свой фреймворк (да?). forEach, map , every , перемешка и т.д я нахожу юзабельными )

у меня тоже есть гит, но он у меня только для сохранение истории изменения кода

Последний раз редактировалось melky, 02.05.2011 в 19:25.
Ответить с цитированием
  #7 (permalink)  
Старый 02.05.2011, 19:46
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от melky
свой фреймворк (да?)
Я бы не стал называть это фреймворком. Так, библиотечка.
Ответить с цитированием
  #8 (permalink)  
Старый 02.05.2011, 19:48
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Kolyaj Посмотреть сообщение
Я бы не стал называть это фреймворком. Так, библиотечка.
свой домашний prototype.js
Ответить с цитированием
  #9 (permalink)  
Старый 03.05.2011, 02:02
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Вроде так понятно написал, но никто не понимает . В общем, на примере:

if (!window.XMLHttpRequest) {
	function XMLHttpRequest() {
		try {return new ActiveXObject('Msxml2.XMLHTTP')} catch (err) {}
		try {return new ActiveXObject('Microsoft.XMLHTTP')} catch (err) {}
		return null;
	}
}

XMLHttpRequest.prototype.myMethod = function() {
	alert('Ok!');
};

var xhr = new XMLHttpRequest();

xhr.myMethod();


Здесь alert не сработает в IE, т. к. в IE конструктор возвращает не свой this.

Последний раз редактировалось Riim, 03.05.2011 в 02:14.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
кеширование HTML переданого через ajax BorisBritva jQuery 6 02.04.2011 01:23