Native XMLHTTP

Рубрика: Development | 28 March 2007, 09:15 | juriy

Или как я искал баг в prototype.js или в IE7

Началось все с безобидного сниппета с использованием prototype.js:

[java]function test() {

new Ajax.Request(“s1.html”,
{
method:’GET’ ,
onSuccess: function(transport) {
var response = transport.responseText || “no response text”;
alert(“Success! \n\n” + response);
},
onFailure: function() {
alert(‘Something went wrong…’);
}
}
);
}[/java]

Сниппет работает везде, кроме IE7. Проснулся спортивный интерес – в чем проблема. Интерес усилился после того, как код без prototype.js отработал нормально.

[java]var http = false;

if(navigator.appName == “Microsoft Internet Explorer”) {
http = new ActiveXObject(“Microsoft.XMLHTTP”);
} else {
http = new XMLHttpRequest();
}

function replace() {
http.open(“GET”, “s1.html”, true);
http.onreadystatechange=function() {
if(http.readyState == 4) {
document.getElementById(‘foo’).innerHTML = http.responseText;
}
}
http.send(null);
}[/java]

После некоторых танцев с бубнами, обнаружилось, что в строке this.transport.open(…) возникает исключение с текстом “Access denied”. Дальше осталось всего ничего – посмотреть объекты, которые использует prototype для XMLHHTP запросов.

Код найти труда не составило:

[java]getTransport: function() {
return Try.these(
function() {alert(“1″); return new XMLHttpRequest()},
function() {alert(“2″); return new ActiveXObject(‘Msxml2.XMLHTTP’)},
function() {alert(“3″); return new ActiveXObject(‘ Microsoft.XMLHTTP’)}
) || false;
}[/java]

Я сильно удивился, когда увидел на экране “1″, вместо “2″, ведь я искренне думал, что IE не поддерживает XMLHttpRequest, а работает только с ActiveX реализациями.

Немного погуглил и нашел статью на сайте мелкомягких

Микрософт сделал очередную “медвежью услугу”: объект поддерживается native’но, запросы from local to local блокируются без компромиссов.

Лекарство: заходим в сервис->свойства обозревателя->Дополнительно. Убираем “галочку” напротив “Включить внутреннюю поддержку XMLHTTP” – и вуаля, все работает.

P.S. Конечно, на практике, это свойство не сильно повредит, ведь мало кто использует в реале ajax запросы “from local to local”, но во время прототипирования интерфейса это замечательное свойство очень полезно. Можно создать несколько текстовых файлов с типичными ответами сервера и тестировать компоненты без самого сервера.

Комментариев: 3

3 Responses to “Native XMLHTTP”

Комментарии:

  1. Скакунов Александр

    Не очень понял (например, “from local to local”), но ИЕ7 ставить не буду :)

  2. vadim

    Я так понимаю что from local to local – это Ajax-запрос со страницы c:\test.html на D:\test2.html

  3. Juriy

    Да, тут Microsoft подразумевает случай, когда http запрос инициирован из файла в локальной файловой системе, и направлен на другой файл локальной файловой системы.
    Остальные запросы классифицируются в соответствии с установленными зонами (Intranet, trusted, etc)

Leave a Reply