XmlHttpRequest недоступен для записи в IE?
Всем привет!
Столкнулся с небольшой проблемой. Использую обработчик событий отсюда. Все хорошо работает, но... как всегда отличился IE. Обработчик событий добавляет в XmlHttpRequest новый объект, в котором сидит функция обработчик. Вот скрин для наглядности: ![]() Однако ишаки ничего не добавляют и, естественно, ниче не работает. Это что получается, XmlHttpRequest в ишаках доступен только для чтения? |
var request; 04 if(window.XMLHttpRequest){ 05 request = new XMLHttpRequest(); 06 }else if(window.ActiveXObject){ 07 request = new ActiveXObject("Microsoft.XMLHTTP"); 08 }else{ 09 return; 10 } Вот так делай ! |
Цитата:
|
kotamirov,
Вообще не о том... Вот так у меня он добывется: function getXmlHttp(){ var xmlhttp; try{ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }catch(E){ xmlhttp = false; } } if(!xmlhttp && typeof XMLHttpRequest!='undefined'){ xmlhttp = new XMLHttpRequest(); } return xmlhttp; } |
Вот полный код библиотеки обработчика:
EventHandler = (function(){ var guid = 0; function fixEvent(event){ event = event || window.event; if (event.isFixed){ return event; } event.isFixed = true; event.preventDefault = event.preventDefault || function(){this.returnValue = false}; event.stopPropagation = event.stopPropagaton || function(){this.cancelBubble = true}; if(!event.target){ event.target = event.srcElement; } if(!event.relatedTarget && event.fromElement){ event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; } if(event.pageX == null && event.clientX != null){ var html = document.documentElement, body = document.body; event.pageX = event.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0); event.pageY = event.clientY + (html && html.scrollTop || body && body.scrollTop || 0) - (html.clientTop || 0); } if (!event.which && event.button){ event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); } return event; } /* Вызывается в контексте элемента всегда this = element */ function commonHandle(event){ event = fixEvent(event); var handlers = this.events[event.type] for(var g in handlers){ var handler = handlers[g]; var ret = handler.call(this, event); if (ret === false){ event.preventDefault(); event.stopPropagation(); } } } return { add: function(elem, type, handler){ if(typeof elem == "undefined"){return;} if(elem.setInterval && (elem != window && !elem.frameElement)){ elem = window; } if(!handler.guid){ handler.guid = ++guid; } if (!elem.events){ // вот здесь ни один IE ничего не добавляет elem.events = {}; // дальше тоже elem.handle = function(event){ if(typeof EventHandler !== "undefined"){ return commonHandle.call(elem, event); } }; } if (!elem.events[type]){ elem.events[type] = {}; if (elem.addEventListener){ elem.addEventListener(type, elem.handle, false); }else if(elem.attachEvent){ elem.attachEvent("on" + type, elem.handle); } } elem.events[type][handler.guid] = handler; }, remove: function(elem, type, handler){ var handlers = elem.events && elem.events[type]; if(!handlers || (handlers[handler.guid] != handler)){return;} delete handlers[handler.guid]; for(var any in handlers){return;} if(elem.removeEventListener){ elem.removeEventListener(type, elem.handle, false); }else if(elem.detachEvent){ elem.detachEvent("on" + type, elem.handle); } delete elem.events[type]; for(var any in elem.events){return;} try{ delete elem.handle; delete elem.events; }catch(e){ // IE elem.removeAttribute("handle"); elem.removeAttribute("events"); } } } }()) Собственно проблему решил - просто сразу присваивал функцию на onreadystatechange. Ну можно еще readystate проверять по таймауту. Но все же интересно почему ишаки так себя ведут |
Теперь понятно. Крайне неудачная реализация EventHandler. Нельзя ничего писать в объекты. Да и не требуется оно.
Цитата:
В IE8 уже есть нормальный (почти) XMLHttpRequest |
Часовой пояс GMT +3, время: 01:13. |