为什么IE 10拒绝通过jQuery $ .ajax发送POST数据

时间:2012-11-02 02:33:05

标签: jquery post internet-explorer-10

在我的开发和生产环境中,IE 10都拒绝通过简单的$ .ajax调用发送任何POST数据。

我的脚本如下所示:

d = 'testvar=something';
$.ajax({
    data: d,
    success: function(h){
        console.log(h);
    }
});

实际的ajax请求正在通过,但没有发布数据???

请求标头看起来很正常:

Request POST /steps/~do HTTP/1.1
Accept  */*
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With    XMLHttpRequest
Referer http://localhost:8080/steps/
Accept-Language en-GB,en-AU;q=0.7,en;q=0.3
Accept-Encoding gzip, deflate
User-Agent  Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Host    localhost:8080
Content-Length  0
DNT 1
Connection  Keep-Alive
Cache-Control   no-cache

但请求正文是空的! (我在他们的F12开发栏中使用IE的网络选项卡来捕获请求)。在PHP脚本中,print_r($_POST);返回一个空数组。

这在IE 7 - 9,chrome,FF和safari中运行良好,但IE10中断了吗?

我不确定我是否错过了什么,或者IE 10是否只是错误的?

修改

我按如下方式设置了全局ajax设置:

$.ajaxSetup({
    url: ROOT+'~do', // ROOT is either http://localhost/.../~do or http(s)://www.steps.org.au/~do depending on production or development environment
    type: 'POST'
});

进一步修改

在Windows 8 Pro 64位上使用IE版本10.0.9200.16384

请求标头的直接复制/粘贴是:

Key Value
Accept  */*
Accept-Encoding gzip, deflate
Accept-Language en-GB,en-AU;q=0.7,en;q=0.3
Cache-Control   no-cache
Connection  Keep-Alive
Content-Length  0
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Cookie  __utma=91949528.1947702769.1348201656.1353212510.1353237955.6; __utmz=91949528.1348201656.1.1.utmcsr=localhost|utmccn=(referral)|utmcmd=referral|utmcct=/coconutoil.org.au/; __utmb=91949528.2.10.1353237955; __utmc=91949528; cartID=8b3b2b9187cfb1aeabd071d6ec86bbbb; PHPSESSID=bl57l7fp0h37au7g0em7i3uv13
DNT 1
Host    www.steps.org.au
Referer https://www.steps.org.au/
Request POST /~do HTTP/1.1
User-Agent  Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
X-Requested-With    XMLHttpRequest

请求正文是emtpy。

回复标题:

Key Value
Response    HTTP/1.1 200 OK
Server  nginx/0.7.65
Date    Sun, 18 Nov 2012 11:23:35 GMT
Content-Type    text/html
Transfer-Encoding   chunked
Connection  close
X-Powered-By    PHP/5.3.5-1ubuntu7.2ppa1~lucid
Expires Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control   no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma  no-cache

引发剂

Property    Value
Stage   Document Processing
Element XMLHttpRequest
Action  Processing
Document ID 0
Frame ID    0
Frame URL   https://www.steps.org.au/Shop/Health-Products/

复制问题的网页(实际上是整个网站):

Steps to Life Shop, Health Products

8 个答案:

答案 0 :(得分:7)

<强>被修改

  

除非使用

,否则微软仍然无法解决此问题      

<meta http-equiv="x-ua-compatible" content="IE=9" >

     

通过添加上面的元标记,IE10将在IE9中运行您的javascript   兼容模式。

老回答。

我发布了我所做测试的示例代码,您也可以使用相同的代码代码。

<html>
<head runat="server">
    <script src="../Scripts/jquery-1.8.3.js"></script>
<script type="text/javascript">
    var xmlHttp = null;
    var XMLHTTPREQUEST_MS_PROGIDS = new Array(
      "Msxml2.XMLHTTP.7.0",
      "Msxml2.XMLHTTP.6.0",
      "Msxml2.XMLHTTP.5.0",
      "Msxml2.XMLHTTP.4.0",
      "MSXML2.XMLHTTP.3.0",
      "MSXML2.XMLHTTP",
      "Microsoft.XMLHTTP"
    );

    function makePOSTRequest(url, parameters) {

        if (window.XMLHttpRequest != null) {
            //xmlHttp = new window.XMLHttpRequest();
            xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
        } else if (window.ActiveXObject != null) {
            // Must be IE, find the right ActiveXObject.
            var success = false;
            for (var i = 0; i < XMLHTTPREQUEST_MS_PROGIDS.length && !success; i++) {
                alert(XMLHTTPREQUEST_MS_PROGIDS[i])
                try {
                    xmlHttp = new ActiveXObject(XMLHTTPREQUEST_MS_PROGIDS[i]);
                    success = true;
                } catch (ex) { }
            }
        } else {
            alert("Your browser does not support AJAX.");
            return xmlHttp;
        }
        xmlHttp.onreadystatechange = alertContents;
        xmlHttp.open('POST', url, true);
        xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
        //xmlHttp.setRequestHeader('Content-type', 'application/json;');
        xmlHttp.setRequestHeader('Content-Length', parameters.length);
        xmlHttp.setRequestHeader('Accept', 'text/html,application/xhtml+xml')
        //xmlHttp.setRequestHeader('Connection', "close");
        xmlHttp.send(parameters);
    }

    function alertContents() {
        // alert( this.status );
        if (xmlHttp.readyState == 4) {
            //alert( this.responseText );
            if (xmlHttp.status == 200) {
                var result = xmlHttp.responseText;
                //  document.getElementById('result').innerHTML = result;
                //  document.getElementById('submitbutton').disabled = false;
                alert(result);
            } else {
                //alert( this.getAllResponseHeaders() );
                alert("There was a problem with the request.");
            }
        }
    }
</script>
</head>
<body>
<a href="javascript:makePOSTRequest('/api/jobs/GetSearchResult','jtStartIndex=0&jtPageSize=10&jtSorting=jobDescription ASC&jobDescription=')">Click me please</a>
    GetJobDetail

    <br/><br/>
    Url: <input type="text" id="url" value="/api/jobs/GetSearchResult"/><br/>
    parameters: <input type="text" id="parameters" value="jtStartIndex=0&jtPageSize=10&jtSorting=jobDescription ASC&jobDescription="/><br/>
    submit : <input type="button" id="callMethod" value = "call" onclick="javascript: makePOSTRequest($('#url').val(), $('#parameters').val())"/>
</body>
</html>

答案 1 :(得分:4)

我有同样的问题。我认为它是一个bug,即10个桌面版。在Windows 8 pro 64bit上运行。 似乎xhr.send方法没有传递数据。它适用于所有其他浏览器,即在城域模式下10或在桌面模式下更改为ie9标准。

答案 2 :(得分:4)

很抱歉,但我所有尝试重现您的问题都没有成功。换句话说,所有POST都是 HTTP正文,并且Ajax请求正常工作。所以我无法重现你所描述的问题。我在所有当前Windows更新的Internet Explorer 10,Windows 8 W64 RTM Enterprise上进行了所有测试。

如果我将一些项目(例如第一项)添加到您引用的the page上的聊天中,我可以看到POST请求将生成以下标题:

Anforderung       POST /~do HTTP/1.1
Accept            */*
Content-Type      application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With  XMLHttpRequest
Referer           https://www.steps.org.au/
Accept-Language   de-DE,de;q=0.8,ru;q=0.7,en-US;q=0.5,en;q=0.3,ja;q=0.2
Accept-Encoding   gzip, deflate
User-Agent        Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch)
Host              www.steps.org.au
Content-Length    81
DNT               1
Connection        Keep-Alive
Cache-Control     no-cache
Cookie            __utmc=91949528; __utma=91949528.365135675.1353268932.1353268932.1353268932.1; __utmb=91949528.1.10.1353268932; __utmz=91949528.1353268932.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); PHPSESSID=ka4shsgkfvnvfdcath2klh9un0; cartID=4a90a72a379989f597276ca30c79c6f6

可以看出Content-Length是81,而不是0.身体是

i=1211&q=1&token=00f5e9f5768d09ae67f2016ebcb62e99a0d75345&cmd=addToCart&sideBar=1

请求将以HTML片段回答,按钮变为绿色。

准确地说,在将项目添加到聊天期间,将会在您的问题中执行另一个代码。它将从shop.1352417874.js执行以下代码(第49-74行):

var n;
function inCart(i,t){
    var a = $('#add'+i);
    var q = t?1:$('#qty'+i).val();
    setLoader(a,(t?60:0),0);
    if(!t) a.addClass('loading').html('').attr('href','javascript:;');
    // d = 'i='+i+'&q='+q+'&token='+TOKEN+'&cmd=addToCart&sideBar=1';   
    $.ajax({
        data: {
            i:i,
            q:q,
            token:TOKEN,
            cmd:"addToCart",
            sideBar: 1
        },
        success: function(h){
            $('#sideCartContents').replaceWith(h);
            mkButtons();
            jsEnhance();
            setLoader();
            n=0;
            if(!t) a.removeClass('loading').addClass('green').attr('href','Shop/Checkout.html').html('Checkout').parent().find('div.QTY').html('<strong>x'+q+'</strong> <span class="inC">in cart</span>');
            flashCart();
        }
    });
}

我的测试中,本地iq变量的值为12111

所以我看不到你描述的任何错误。因此,您必须在您的环境中调试代码,然后再将其复制。在测试期间,我建议您使用非最小化的jQuery代码。您可以调试jQuery.ajax的代码来本地化您的问题。

然而,我还有一些额外的建议:

  1. 首先,您应该error回调$.ajax来电,而不仅仅是success回拨。
  2. 您应该查看您使用的JavaScript代码。例如,在上面的代码片段中,您定义了全局变量n,它将是全局window对象的属性。由于副作用以及与您在页面上包含的其他JavaScript代码的冲突,引入此类变量非常危险。在其他一些地方,您间接设置全局 window对象的新属性。例如,common.1345011838.js中定义的全球 doErrors函数的代码如下所示
  3. function doErrors(e,d){
        e=e.split(',');
        for(i in e){
            $((d?d+' ':'')+'[name="'+e[i]+'"]:visible').addClass('error');
        }
        errors();
    }
    

    在上面的代码中,您使用i变量而不定义它。所以你设置(或使用)window.i变量的方式。很明显,在数组的情况下使用for-in循环是不好的。可以用for(var i=0,l=e.length; i<l; i++) {...}等等代码重写代码。

    此外,您使用

    启动common.1345011838.js的代码
    var w,r,i,p,t,l,c,z,e,m,b,k,u,s,CPH,TOKEN;
    var z = new Array();
    var ROOT;
    

    定义了许多带有短名称的全局变量。这是非常糟糕的风格。它可能会与您包含的其他模块发生冲突。通常,在某些函数中定义所需的大多数变量就足够了。您可以在$(document).ready(function(){/*.HERE.*/});内移动大多数变量的声明。

    如果你真的需要定义一些全局变量,你可以定义一个,它就像名称空间和你可以定义为属性的所有其他变量< / em>唯一的全局对象。这是标准做法。在这种方式中,可以减少您使用的不同模块之间可能发生的冲突的数量。例如,您可以使用类似

    的内容
    MYGLOBALCHATOBJECT = {
        root: "/",
        z: [],
    };
    
    ...
    // add new property
    MYGLOBALCHATOBJECT.TOKEN = "some value";
    

    你应该在另一个函数的上下文中定义许多函数。在这种方式中,您可以减少定义许多全局变量的需要。只是一个示例上面的inCart代码使用n函数上面定义的inCart变量。变量n将仅在flashCart之后直接定义的其他全局函数inCart中使用。此外,函数flashCart将仅在回调success内使用。因此,您可以重写代码,以便在回调n内定义flashCartsuccess

    ...
    success: function (h) {
        // define LOCAL variable n
        var n = 0;
        // define LOCAL function which can use outer variable n
        function flashCart(){
            if(n<3) { 
                setTimeout("flashCart()",120);
                n=n+1;
            }
            $('#sideCartBox').toggleClass('highlighted');
        }
    
        $('#sideCartContents').replaceWith(h);
        mkButtons();
        jsEnhance();
        setLoader();
        if(!t) a.removeClass('loading').addClass('green').attr('href','Shop/Checkout.html').html('Checkout').parent().find('div.QTY').html('<strong>x'+q+'</strong> <span class="inC">in cart</span>');
        flashCart(); // we use LOCAL function
    }
    

    我建议您另外在JSHintJSLint中测试您的代码。

答案 3 :(得分:2)

我也面临同样的问题,下面的修改对我有用。

<meta http-equiv="x-ua-compatible" content="IE=9" >

为我工作:)

答案 4 :(得分:1)

面对同样的问题,我无法通过设置<meta http-equiv="x-ua-compatible" content="IE=9">解决问题,但是我通过将响应标头X-UA-Compatible设置为IE9来强制执行此操作,这是元推荐的方式标头在HTML5验证器中无法识别。

对于J2EE应用程序,可以使用以下过滤器实现:

public class IECompatibilityFilter implements Filter {
    private String compatibilityMode = "IE=10";
    public IECompatibilityFilter() {
    }
    public String getCompatibilityMode() {
        return compatibilityMode;
    }
    public void setCompatibilityMode(String compatibilityMode) {
        this.compatibilityMode = compatibilityMode;
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String mode = filterConfig.getInitParameter("compatibilityMode");
        if (StringUtils.isNotBlank(mode)) {
            this.compatibilityMode = StringUtils.trim(mode);
        }
    }
    @Override
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain)
            throws IOException, ServletException {
        if (!response.isCommitted() && response instanceof HttpServletResponse) {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            httpResponse.addHeader("X-UA-Compatible", compatibilityMode);
        }
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() {
    }
}

web.xml注册。

<filter>
  <filter-name>ieCompatibilityFilter</filter-name>
  <filter-class>com.foobar.web.filter.IECompatibilityFilter</filter-class>
  <init-param>
    <param-name>compatibilityMode</param-name>
    <param-value>IE=9</param-value>
  </init-param>
</filter>

答案 5 :(得分:0)

我有类似的东西(Problems with image upload from browsers to Amazon S3),我发现在我的情况下,当xhr对象从http://some.server.com请求https://my.local.server.com:123/foo时会崩溃。它在xhr.open(“POST”,httpUrl,true)调用时崩溃。

它可能是一个IE10错误(多么令人惊讶;)),它在Win7和Win8上都崩溃了。

答案 6 :(得分:0)

我有同样的问题,但只有一个请求,我的意思是我有一个处理许多ajax请求的Web应用程序。看看你的标记。我在表格中有表格布局

<table>
    <form></form>
</table>

我只是换了另一种方式。形式&gt;表

答案 7 :(得分:0)

似乎存在一个Window 8问题,即跨域https 请求。我无法确认它是否与证书的有效性有关,因为我的跨域服务器上的证书无效(开发服务器)。

此链接是一种解决方法,但谁想要引导整个应用程序为IE10 +发出GET请求? http://jonnyreeves.co.uk/2013/making-xhr-request-to-https-domains-with-winjs/