为什么IE 10拒绝通过jQuery $ .ajax发送POST数据
在我的开发和生产环境中,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/
复制问题的页面(实际上是整个网站):
Life Shop,健康产品的步骤
编辑
除了使用之外,微软还没有解决这个问题
通过添加上面的元标记,IE10将在IE9兼容模式下运行您的javascript。
老答案。
我发布了我所做的测试的示例代码,您也可以使用相同的代码代码。
Click me please GetJobDetail
Url:
parameters:
submit :
我有同样的问题。 我认为这是一个关于10桌面版的错误。 在Windows 8 pro 64bit上运行。 似乎xhr.send方法没有传递数据。 它适用于所有其他浏览器,即在城域模式下10或在桌面模式下更改为ie9标准。
对不起,但是我所有尝试重现你的问题都没有成功。 换句话说,所有POST都使用 HTTP正文,并且Ajax请求正常工作。 所以我无法重现你所描述的问题。 我在所有当前Windows更新的Internet Explorer 10,Windows 8 W64 RTM Enterprise上进行了所有测试。
如果我在您引用的页面上的聊天中添加了一些项目(例如第一个项目),我可以看到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('x'+q+' in cart'); flashCart(); } }); }
在我的测试中,局部i
和q
变量的值是1211
和1
。
所以我看不出你描述的任何错误。 因此,您必须在您的环境中调试代码,然后再将其复制 。 在测试期间,我建议你使用非最小化的jQuery代码。 您可以调试jQuery.ajax的代码来本地化您的问题。
不过我还有一些额外的建议:
- 首先,您应该在
$.ajax
调用中包含error
回调,而不仅仅是success
回调。 - 您应该查看您使用的JavaScript代码。 例如,在上面的代码片段中,您定义了全局变量
n
,它将是全局window
对象的属性。 由于副作用以及与您在页面上包含的其他JavaScript代码的冲突,引入此类变量非常危险。 在其他一些地方,您可以间接设置全局window
对象的新属性。 例如,doErrors
定义的全局doErrors
函数的代码如下所示
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
此外,您启动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.*/});
移动大多数变量的声明$(document).ready(function(){/*.HERE.*/});
。
如果您确实需要定义一些全局变量,您可以定义一个类似于命名空间的变量,以及您可以定义为唯一全局对象的属性的所有其他变量。 这是标准做法。 通过这种方式可以减少您使用的不同模块之间可能发生的冲突。 例如,您可以使用类似的东西
MYGLOBALCHATOBJECT = { root: "/", z: [], }; ... // add new property MYGLOBALCHATOBJECT.TOKEN = "some value";
你应该在另一个函数的上下文中定义许多函数。 在这种方式中,您可以减少定义许多全局变量的需要。 只是一个例子上面的inCart
代码使用了上面定义的inCart
函数的变量。 变量n
仅在 flashCart
之后直接定义的其他全局函数flashCart
inCart
。 此外,函数flashCart
将仅用于回调success
。 因此,您可以重写代码,以便在回调success
定义n
和flashCart
:
... 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('x'+q+' in cart'); flashCart(); // we use LOCAL function }
我建议你另外在JSHint或JSLint中测试你的代码。
我也面临同样的问题,以下变化对我有用。
为我工作:)
面对同样的问题我无法通过设置 ,但我通过设置响应头
X-UA-Compatible
来强迫这个IE9
是推荐的方式,因为元标题在HTML5validation器中无法识别。
对于J2EE应用程序,可以使用以下filter实现:
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
注册。
ieCompatibilityFilter com.foobar.web.filter.IECompatibilityFilter compatibilityMode IE=9
我有类似的东西( 从浏览器上传到Amazon S3的图像问题 ),我发现在我的情况下xhr对象在从https:// my请求http://some.server.com后崩溃了。 local.server.com:123/foo 。 它在xhr.open(“POST”,httpUrl,true)调用时崩溃。
它可能是一个IE10错误(多么令人惊讶;)),它在Win7和Win8上都崩溃了。
我有同样的问题但只有一个请求,我的意思是我有一个处理许多ajax请求的Web应用程序。 看看你的标记。 我把表格放在桌子里面进行布局
我只是换了另一种方式。 表格>表格。
似乎存在Window 8问题,从而产生跨域https请求。 我无法确认它是否与证书的有效性有关,因为我的跨域服务器上的那个是无效的(开发服务器)。
这个链接是一个解决方法,但谁想要引导他们的整个应用程序只为IE10 +发出GET请求? http://jonnyreeves.co.uk/2013/making-xhr-request-to-https-domains-with-winjs/