浏览 3841 次
锁定老帖子 主题:ajax问题总结
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-26
测试浏览器:ie为ie6,firefox为2,其他的未测试。统称ie6为ie,firefox2为ff。 基本的 1,最经典的就是ie下的缓存问题了。 如果使用的是get,那么在ie下出现缓存问题。导致代码只执行一次。解决办法就是加时间戳或者随机数,使url变为唯一,这样就不会出现ie下的缓存问题了,或者改为post提交。 JScript code xhr.open("get","xxxx.aspx?_dc="+new Date().getTime(),true); 2,ajax对象属性的大小写问题 在w3c浏览器,如ff中,对大小写是敏感。如 if(xhr.readystate==4)这种写法,在ie下是成立的,但是在ff下就行不通了,因为ie不区分大小写,ff是区分大小的。 标准写法为if(xhr.readyState==4),同理还有属性 responseText,responseXML。 3,ajax状态0问题 有些时候在测试ajax代码的时候,加了 xhr.status==200的判断后,一直不执行xhr.status==200的代码,这个就需要注意了。xhr.status==200是要通过服务器来浏览,并且服务器页面没有发生错误或者转向时才返回200状态的,此状态和你通过浏览器访问页面时服务器定义的状态一致。 直接拖进浏览器浏览结果或者双击运行html页面的,未发生错误时,此时的xhr.status是0,不是200。 所以可以多加一个xhr.status==0的判断。如下 JScript code if(xhr.status==200||xhr.status==0){ alert('ok'); } 直接拖进浏览器浏览结果或者双击运行html页面时,又出现一个问题,如果请求的是xml文件,那想当然的是使用responseXML属性返回xmlDom了,但是在ie返回不了xmlDom属性,解决办法如何呢,看下面的responseXML问题。 4,responseXML问题。 要使用responseXML属性,请求的是xml文件或者设置了响应头为"text/xml"的动态页面了。要注意如果请求的是动态页面,一定不要忘记设置contenttype为"text/xml"!!!!!!!!切记~~~~~~ asp为 response.contenttype="text/html" asp.net为 Response.ContentType="text/html"; php为 header("content-type:text/xml;"); 在ie下有个问题,直接拖进浏览器浏览或者双击运行html预览效果时,请求的即使是xml文件,使用responseXML返回不了xmldom。 大家测试下就知道了,如下 showbo.xml XML code <?xml version="1.0" encoding="utf-8"?> <showbo> <item>1</item> <item>2</item> <item>3</item> <item>4</item> </showbo> test.html JScript code function getajax(){ if(window.XMLHttpRequest)return new XMLHttpRequest(); else if(window.ActiveXObject)return new ActiveXObject("microsoft.xmlhttp"); } var xhr=getajax(); xhr.onreadystatechange=function(){ if(xhr.readyState==4){ if(xhr.status==200||xhr.status==0){ var doc=xhr.responseXML,item=doc.getElementsByTagName("item"); alert(item.length);//在ie输出为0,在ff下为4。似乎在ie下未生成xml的树结构,具体原因要问ms了。。 } else alert('发生错误\n\n'+xhr.status); } } xhr.open("get","showbo.xml?_dc="+new Date().getTime(),true); xhr.send(null); 解决办法就是使用microsoft.xmldom对象重新建立xml的树结构,如下 JScript code xhr.onreadystatechange=function(){ if(xhr.readyState==4){ if(xhr.status==200||xhr.status==0){ var doc=xhr.responseXML; if(document.all&&xhr.status==0){//为ie并且直接托进浏览器的时重构xml的树结构 doc=new ActiveXObject("microsoft.xmldom"); doc.loadXML(xhr.responseText); doc=doc.documentElement; } var item=doc.getElementsByTagName("item"); alert(item.length);//在ie输出为0,在ff下为4。似乎在ie下未生成xml的树结构,具体原因要问ms了。。 } else alert('发生错误\n\n'+xhr.status); } } 5,为post提交时需要注意的。 1)如果为post提交时,注意要设置content-type为"application/x-www-form-urlencoded",这样在动态页才可以使用request/request.form/request.querystring对象通过键获取值,否则得使用2进制数据,然后自己分析2进制数据生成字符串对象,使用正则什么的获取对应的值。 2)需要在open以后才能使用xhr.setRequestHeader方法,否则出错。 JScript code xhr.open("post","xxxx.aspx",true); xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");//这里 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-11-14
最经典的还是跨域问题
|
|
返回顶楼 | |
发表时间:2011-12-29
楼主,IE中不能显示的问题纠结了好几天了,谢谢
|
|
返回顶楼 | |
发表时间:2012-05-23
其实缓存也没有什么不好了,为什么FF和chrome不缓存呢?
|
|
返回顶楼 | |