jQuery AJAX POST 请求在 ie9 中丢弃正文

标签 jquery ajax internet-explorer internet-explorer-9

我编写了一个 Javascript 方法,该方法将跨域 POST 请求从客户端浏览器发送到我们用 PHP 编写的 API:

$.ajax({
    type:        'POST',
    url:        backend_url,
    data:        postArgs,
    beforeSend:    function( xhr, settings ) {
        xhr.setRequestHeader( 'Connection', 'close' );
    },
    error:        function( xhr, status, errorThrown ) {
        console.log( 'RECONTRIBUTION: Error on AJAX request! status=' + status + ', errorThrown=' + errorThrown + ', statusText=' + xhr.statusText );
        $( '#alert_message' ).showAlertMsg( 'error', 'Oops, we couldn\'t talk to our server!  Please try again in a moment.' );
    },
    success:    function( data, status, response ) {
        //do things
    }
});

在 Firefox、Chrome 和 Safari 中一切正常,但在 IE9 中我遇到了问题。第一个问题是我收到“No Transport”错误,我认为这是由 IE 对跨域请求的限制引起的。我通过将 jQuery.support.cors 设置为 true 并包含此插件(在不同的 SO 线程上找到)来完成请求:https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest/blob/master/jQuery.XDomainRequest.js

现在请求已完成,但 API 返回错误,因为请求正文丢失。

来自 Chrome 的工作请求(网址已编辑):

POST [backendurl] HTTP/1.1
Host: [backendurl]
Connection: keep-alive
Content-Length: 79
Origin: [frontendurl]
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.83 Safari/537.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: */*
Referer: [frontendurl]
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
DNT: 1

action=contributeSong&client=TUNEBOT&iTunes_id=17344380&user_id=&query_id=64600

来自 IE9 的无效请求:

POST [backendurl] HTTP/1.1
Accept: */*
Origin: [frontendurl]
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Host: [backendurl]
Content-Length: 0
Connection: Keep-Alive
Pragma: no-cache

奇怪的是,我尝试将 Connection header 设置为 Close,因为我读到 Keep-Alive 有时会导致 Internet Explorer 出现问题...但请求无论如何都会发送 Connection: Keep-Alive。有任何想法吗?我已经为此烦恼了好几天了。

更新:好的,在阅读了有关 XDR 对象的更多内容后,我意识到我无法发送自定义 header ,这解释了 Keep-Alive 问题。我查看了该插件,它没有向服务器发送任何数据(...),所以现在我收到了似乎正在发送数据的请求,但仍然得到相同的响应...

POST [backendurl] HTTP/1.1
Accept: */*
Origin: [frontendurl]
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Host: [backendurl]
Content-Length: 79
Connection: Keep-Alive
Pragma: no-cache

action=contributeSong&client=TUNEBOT&iTunes_id=23148795&user_id=&query_id=64612

按照下面的建议添加 cache:false 选项似乎不会产生任何影响。 Connection:Keep-Alive 是什么让我丧命?

最佳答案

试试这个:一旦你调用你的 $().ready(function() { - 确保设置这个:

$.ajaxSetup({ cache: false });

这避免了由于 IE 试图变得聪明而导致的问题。

关于jQuery AJAX POST 请求在 ie9 中丢弃正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12289619/

相关文章:

javascript - 如何根据按钮单击验证表单字段?

JavaScript 日期创建在 IE 中失败

css - Internet Explorer super 鱼问题

javascript - 使用 "is not"规则进行浏览器检查

jquery-plugins - 打印 jquery colorbox 内容

javascript - 引用 SELECT 列表 jQuery

javascript - 根据先前输入值的组合显示不同的表单选项

javascript - 来自 jQuery 的 Rails : ensure that $. post 在 Controller 中作为 format.json 接收

javascript - Rails - 使用ajax在div中显示show

通过 AJAX 的 jQuery XML : missing some nodes occasionally