在我的开发和生产环境中,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/
复制问题的网页(实际上是整个网站):
答案 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();
}
});
}
我的测试中,本地i
和q
变量的值为1211
和1
。
所以我看不到你描述的任何错误。因此,您必须在您的环境中调试代码,然后再将其复制。在测试期间,我建议您使用非最小化的jQuery代码。您可以调试jQuery.ajax的代码来本地化您的问题。
然而,我还有一些额外的建议:
error
回调$.ajax
来电,而不仅仅是success
回拨。n
,它将是全局window
对象的属性。由于副作用以及与您在页面上包含的其他JavaScript代码的冲突,引入此类变量非常危险。在其他一些地方,您间接设置全局 window
对象的新属性。例如,common.1345011838.js中定义的全球 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<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
内定义flashCart
和success
:
...
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
}
答案 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/