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

为什么IE 10拒绝通过jQuery$.ajax发送POST数据,jquery,post,internet-explorer-10,Jquery,Post,Internet Explorer 10,在我的开发和生产环境中,IE10拒绝通过简单的$.ajax调用发送任何POST数据 我的脚本如下所示: d = 'testvar=something'; $.ajax({ data: d, success: function(h){ console.log(h); } }); 实际的ajax请求正在通过,但没有post数据 请求头看起来很正常: Request POST /steps/~do HTTP/1.1 Accept */* Content-Ty

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

我的脚本如下所示:

d = 'testvar=something';
$.ajax({
    data: d,
    success: function(h){
        console.log(h);
    }
});
实际的ajax请求正在通过,但没有post数据

请求头看起来很正常:

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
但是请求主体是空的!(我正在使用IE的F12开发栏中的网络选项卡来捕获请求)。在PHP脚本中,
print\r($\u POST)返回一个空数组

这在IE7-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/
复制问题的页面(实际上是整个站点):


我也有同样的问题。我认为这是IE10桌面版的一个缺陷。在windows 8 pro 64位上运行。
似乎xhr.send方法没有传递数据。它可以在所有其他浏览器中正常工作,在metro模式下使用IE10,或者在桌面模式下更改为ie9标准。

对不起,我所有重现您问题的尝试都没有成功。换句话说,所有帖子都使用HTTP主体,Ajax请求工作正常。所以我无法重现你描述的问题。我在InternetExplorer10、Windows8W64RTMSenterprise和所有当前Windows更新上进行了所有测试

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

anfordung POST/~do HTTP/1.1
接受*/*
内容类型应用程序/x-www-form-urlencoded;字符集=UTF-8
X-request-With-XMLHttpRequest
推荐人https://www.steps.org.au/
接受语言德德,德;q=0.8,ru;q=0.7,在美国;q=0.5,en;q=0.3,ja;q=0.2
接受编码gzip,放气
用户代理Mozilla/5.0(兼容;MSIE 10.0;Windows NT 6.2;WOW64;Trident/6.0;触摸屏)
主机:www.steps.org.au
内容长度81
DNT 1
连接保持活动状态
缓存控制无缓存
Cookie uuUTMC=91949528__utma=91949528.365135675.1353268932.1353268932.1353268932.1353268932.1__utmb=91949528.1.10.1353268932__utmz=91949528.1353268932.1.1.utmcsr=(直接)| UTMCN=(直接)| utmcmd=(无);PHPSESSID=ka4shsgkfvnfdcath2klh9un0;cartID=4A90A72A37989F597276CA30C79C6F6
你可以看到
内容长度
是81,而不是0。尸体是

i=1211&q=1&token=00f5e9f5768d09ae67f2016ebcb62e99a0d75345&cmd=addToCart&sideBar=1
请求将用HTML片段回答,按钮变为绿色

确切地说,在将项目添加到聊天中的过程中,它将在您发布问题时执行另一个代码。它将从以下代码(第49-74行)执行:

varn;
功能体现(i,t){
变量a=$('加'+i);
var q=t?1:$('#qty'+i).val();
设定加载器(a,(t?60:0),0);
如果(!t)a.addClass('loading').html(''.attr('href','javascript:;');
//d='i='+i+'&q='+q+'&token='+token+'&cmd=addToCart&sideBar=1';
$.ajax({
数据:{
i:我,
问:问,,
令牌:令牌,
cmd:“addToCart”,
边栏:1
},
成功:功能(h){
$(#sideCartContents')。替换为(h);
mkButtons();
jsEnhance();
setLoader();
n=0;
if(!t)a.removeClass('load').addClass('green').attr('href','Shop/Checkout.html').html('Checkout').parent().find('div.QTY').html('x'+q+'in cart');
flashCart();
}
});
}
在我的测试中,局部
i
q
变量的值分别为
1211
1

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

不过,我还有一些额外的建议:

  • 首先,您应该包括
    error
    回调到
    $.ajax
    调用,而不仅仅是
    success
    回调
  • 您应该检查您使用的JavaScript代码。例如,在上面的代码片段中,您定义了global变量
    n
    ,它将是global
    窗口
    对象的属性。引入这些变量是非常危险的,因为它会产生副作用,并与页面上包含的其他JavaScript代码冲突。在其他一些地方,可以间接设置全局
    窗口
    对象的新属性。例如,中定义的全局
    doErrors
    函数的代码如下所示
  • 函数执行错误(e,d){
    e=e.split(',');
    for(i在e中){
    $((d?d+'':'')+'[name=“'+e[i]+']:visible')。addClass('error');
    }
    错误();
    }
    

    在上面的代码中,您使用
    i
    变量而不定义它。因此,您可以设置(或使用)
    window.i
    变量。很明显,在数组中使用
    for in
    循环是不好的。人们可以用类似于(var i=0,l=e.length;i编辑的
    for(var i=0,l=e.length;i的等效代码重写代码

    除使用外,Microsoft仍没有对此进行任何修复

    通过添加上面的meta标记,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>
    
    
    var xmlHttp=null;
    var XMLHTTPREQUEST\u MS\u PROGIDS=新数组(
    “Msxml2.XMLHTTP.7.0”,
    “Msxml2.XMLHTTP.6.0”,
    “Msxml2.XMLHTTP.5.0”,
    “Msxml2.XMLHTTP.4.0”,
    “MSXML2。
    
    MYGLOBALCHATOBJECT = {
        root: "/",
        z: [],
    };
    
    ...
    // add new property
    MYGLOBALCHATOBJECT.TOKEN = "some value";
    
    ...
    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
    }
    
    <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>
    
    <meta http-equiv="x-ua-compatible" content="IE=9" >
    
    <table>
        <form></form>
    </table>
    
    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() {
        }
    }
    
    <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>