当火狐,谷歌正常而IE和 360 浏览器直接对$.ajax执行error而不执行 success时,首先明摆 着 是不兼容问题。那么原因在哪?苦逼的码农难免要做一会名侦探 柯南,福尔摩斯什么的。
由于不怎么用IE调试了,都用的火狐,所以HTTPwatch自然也就打入冷宫了,也就没用它查看请求了。。
于是,,,然后。。。。。做了一 系列的折腾:
首先,代码是这样的:
function studentModiChoose(chooseId) { var currentAjax = $.ajax({ url:'',//index.php?mod=order&act=getinfo data:{'flag':'studentModiChoose','chooseId':chooseId}, type:"post", cache : false, beforeSend: function(){ }, success: function(data){ try{var myObject = eval('(' + data + ')');}catch (ex){return ;} if (myObject["rtn"] == "ok") { showstudentDivbyChoose(myObject["data"]); } else { alert(myObject["error_txt"]); } }, timeout:30000, error: function(data){ currentAjax.abort(); } }); }
在IE一跑,呀,报的是“currentAjax 不是对象或者对象为空”,那果断一 想啊,IE是不是小时候被爆过菊长大了有阴影不喜欢这个家伙啊,于是啪啪给注释了。
这个时候一跑,咦,啥也不反应了,动也不动,装死啊。
于是用 alert()跟了一下执行,发现直接 不执行success 而 error。而我们知道很多时候这种情况的出现是URL没有写对,余光瞄了一下,url:'';这人是对的啊,当前文件嘛,火狐和谷歌都知道(万万没想到IE的智商。。。居然不认'')。
于是啊怀疑请求头类型,发现contentType请求前后不一致,但是contentType:text/html,发现不起作用,值没有改变,为什么呢?因为。。。。吧啦吧啦。。。
怀疑json数据的格式不标准,于是想用console.log()搞出点农夫山 泉来看看是不是甜的。哇靠,在控制台搞出来的是这个叼样子
谁说IE的console.log()函数会报错的。什么?我用的是哪个版本?8.0.7****.
发现这没得玩啊,于是也考虑了什么json数据单双引 号问题,在外部加 ()问题,最终还是未果。
在error输出data,还搞 出错来:
真是屎可忍,尿也不可忍。
最后实在没招 了,死马 当活牛医。
url:'index.php?mod=order&act=getinfo',
这样就OK了。!!!
而且改完之后发现:var currentAjax = $.ajax({})的var currentAjax 不是对象或为空也不报了,真的是腰不疼 腿不酸了,那啥也有劲了。
总结:
很多时候ajax直接执行error只是地址写错问题。PS:地址写错还有一种常见现象就是直接返回了整个页面内容。
而 这次遇到的是IE和360不兼容问题,绕了个大圈 ,最终 还是地址的问题。
IE和360不接受''这样的URL提交到当前页面,它 默认为空。所以直接 error了。
这点要注意以后编码的时候特别注意,因为其他浏览器正常很容易忽略这个隐含的不兼容BUG。