2010-04-17 1 views
3

Я пытаюсь создать запрос AJAX в IE8.IE8 AJAX GET setRequestHeaders не работает, если параметры не указаны в URL-адресе

var xhr = new ActiveXObject('Msxml2.XMLHTTP'); 
xhr.open('GET', '/ajax/'); 
// Required header for Django to detect AJAX request 
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 
xhr.onreadystatechange = function() { 
    if (this.readyState == 4) console.log(this.responseText); 
} 
xhr.send(null); 

Это прекрасно работает в Firefox, Chrome, Safari. Однако в IE8 все мои тестовые запросы AJAX работают EXCEPT для тех, где я выполняю GET без каких-либо параметров строки запроса (например, выше). Работать без запросы POST вопроса, и GET запросы работают только всякий раз, когда я включаю строки запроса в URL, например:

xhr.open('GET', '/ajax/?foo=bar') 

Я также 110% уверен, что мой код сервер обрабатывает эти запросы соответствующим образом, поэтому, это пни меня полностью.

У кого-нибудь есть ключ к тому, что может быть причиной этого?

+0

Я знаю, что это не тот ответ, который вы ищете, почему бы вам не использовать jquery? Он берет на себя всю ответственность за совместимость с браузером. Поэтому попробуйте. Он также не изменит большую часть вашего кода. :) – Bipul

+0

Вы пытались использовать что-то вроде wireshark, чтобы определить, действительно ли IE выдает HTTP-запрос? То есть, вы уверены, что браузер не решает «эй, мне не нужно даже запускать HTTP-запрос, потому что у меня есть этот URL-адрес в кеше!» – Pointy

+0

@Pointy - я должен очистить кэш и перезагрузить сервер после любых изменений. @Bipul - я пишу свою собственную фреймворк, но мне нравится jQuery =) – ground5hark

ответ

0

Стандарты определяют, что запросы GET имеют (а) параметры запроса. Я предполагаю, что MSIE8 действует соответствующим образом в этом случае, а другие браузеры «позволяют ему сползать».

Если вы хотите загрузить страницу, вы можете отправить запрос GET к файлу, который затем включает/freads/независимо от содержимого файла и отправляет его обратно. В этом случае у вас будет файл-посредник, который включает в себя любую страницу, отправленную как параметр (например, ?foo=bar.)

В любом случае, я бы использовал jQuery для выбора объекта HTTP-ресурса, иначе вам придется сделайте что-нибудь подобное для полной совместимости:

var XMLHttpArray = [       
    function() {return new XMLHttpRequest();}, 
    function() {return new ActiveXObject("Msxml2.XMLHTTP");}, 
    function() {return new ActiveXObject("Msxml2.XMLHTTP");}, 
    function() {return new ActiveXObject("Microsoft.XMLHTTP");}  
]; 

function XMLHTTPObject(){ 
    var xmlhttp = false; 
    for(var i=0; i<XMLHttpArray.length; i++){ 
      try{ 
        xmlhttp = XMLHttpArray[i](); 
      }catch(e){ 
        continue; 
      } 
      break; 
    } 
    return xmlhttp;  
}; 

var http = XMLHTTPObject(); 
http.open(...);