为什么IE 10拒绝通过jQuery$.ajax发送POST数据
在我的开发和生产环境中,IE10拒绝通过简单的$.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
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>