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, время: 23:15. |