IE8 AJAX GET setRequestHeaders 不工作,除非在 URL 中提供参数

Posted

技术标签:

【中文标题】IE8 AJAX GET setRequestHeaders 不工作,除非在 URL 中提供参数【英文标题】:IE8 AJAX GET setRequestHeaders not working unless params provided in URL 【发布时间】:2011-02-09 02:11:14 【问题描述】:

我正在尝试在 IE8 中创建 AJAX 请求。

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 测试请求都可以工作,除了那些我在没有任何查询字符串参数的情况下执行 GET 的请求(例如上面的请求)。 POST 毫无疑问可以正常工作,而 GET 请求仅在我在 URL 中包含查询字符串时才有效,如下所示:

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

我也 110% 肯定我的服务器代码正在适当地处理这些请求,所以,这完全让我难过。

有人知道是什么原因造成的吗?

【问题讨论】:

我知道这可能不是您正在寻找的答案,您为什么不使用 jquery?它承担您浏览器兼容性的所有责任。所以,试一试吧。它也不会改变你的大部分代码。 :) 您是否尝试过使用wireshark 之类的工具来确定IE 是否正在发出HTTP 请求?也就是说,您确定浏览器没有决定“嘿,我什至不需要运行 HTTP 请求,因为我在缓存中有那个 URL!” @Pointy - 我确保清除缓存并在任何更改后重新启动服务器。 @Bipul - 我正在编写自己的框架,但我喜欢 jQuery =) 【参考方案1】:

标准规定 GET 请求具有 (a) 查询参数。我的猜测是 MSIE8 在这种情况下表现得恰到好处,而其他浏览器正在“让它滑动”。

如果您的意图是加载页面,您可以向文件发送GET 请求,然后该文件包含/freads/whatever 内容文件并将其发回。在这种情况下,您将拥有一个中间文件,其中包含作为参数发送的任何页面(例如,?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(...);

【讨论】:

以上是关于IE8 AJAX GET setRequestHeaders 不工作,除非在 URL 中提供参数的主要内容,如果未能解决你的问题,请参考以下文章

在 IE8 中意外缓存 AJAX 结果

在 WebView 中覆盖 AJAX 标头

通过jQuery Ajax使用FormData对象上传文件

AJAX原理

ie8 的 ajax 无效

Ajax异步封装