CSDN-CSDN社区-Web 开发-Ajax

收藏 [推荐] [总结]ajax问题总结[问题点数:200,结帖人:showbo]

楼主发表于:2009-07-02 11:57:55
在看文章前,先指定一个通用的变量xhr,xhr代码ajax对象。

测试浏览器: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");//这里。。。。



乱码问题
对于ajax应用来说,乱码也是一个经常出现的问题。
1)meta声明的charset要和请求的页面返回的charset一致。最好在请求的页面中再设置下输出编码。
  asp: response.charset="gb2312或者utf-8"
asp.net: response.charset="gb2312或者utf-8"
  php: header("charset=gb2312或者utf-8")

2)文件物理存储编码要和meta声明的编码要一致。如meta指定为gb2312,则物理存储编码为ansi。如果为utf-8,则要存储为utf-8编码。
对于asp,如果指定编码为utf-8,记得还要设置
'防止asp使用utf-8编码时中文出现乱码
VBScript code
Session.CodePage=65001 Response.CharSet="utf-8"
因为asp在国内服务器默认处理编码为gb2312

对于asp.net的话,meta设置为gb2312时,最好设置web.config文件中的
XML code
<globalization requestEncoding="gb2312" responseEncoding="gb2312"/>
,并且在输出中文前设置Response.CharSet="gb2312";
因为asp.net默认的编码为utf-8

3)发送中文到动态页面时使用escape/encodeURI/encodeURIComponent编码一下。建议使用encodeURIComponent。
更多的js编码信息查看这篇文章
JS URL编码函数

对于php来说,还有个问题,需要在服务器点解码下。可以看这篇文章里面的讨论。

写了一个php查询,但是就是传不出中文。

4)如果1-2都对上了但是在接受服务器端发送的信息时还是出现乱码,试试用XML作为信息载体,然后使用responseXML分析下回传的xml文件。因为ajax原本就是用xml作为信息载体的。。。。。。ajax英文名原本就是“异步javascript和xml”【asynchronous javascript and xml】

如果不会解析xml文件,可以参考这篇文章

JavaScript解析XML的方法总结


下面是一些csdn上出现乱码的文章和解决办法,还未解决的看看,是否和你的如出一辙。

在FireFox浏览器中asp.net+AJAX传输的中文字符串到服务器端后乱码的问题!!!!
请教ajax返回乱码

就列上面两个了,要查找更多的,查看这个查询连接,都是ajax出现乱码的问题。
http://so.csdn.net/bbsSearchResult.aspx?q=ajax+%e4%b9%b1%e7%a0%81&p=0


同步问题

问题描述如下,问题来自http://topic.csdn.net/u/20090630/16/d4d07596-65da-430c-8e89-cae60e25e03c.html,精简了下创建ajax的代码
JScript code
function callServerByPost(url,data,fun) { var http_request=null; if (window.ActiveXObject)http_request = new ActiveXObject("Microsoft.XMLHTTP"); }else if (window.XMLHttpRequest) http_request = new XMLHttpRequest(); if (!http_request) { alert('Giving up :Cannot create an XMLHTTP instance'); return false; } http_request.onreadystatechange = fun; http_request.open("POST", url, true); http_request.setrequestheader("Content-length",data.length); http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); http_request.send(data);//传送资料 } function ajax_post(url,data) { url=url+"?t="+new Date(); callServerByPost(url,data,function fns(){ if(http_request.readyState == 4) { if (http_request.status == 200) { return http_request.responseText;//在这里明明调试时http_request.responseText已经有值但是在外边却接收不到 } else { alert("你请求数据有错"); } } }); } function getData(){ var url="ajax_server.aspx"; var data="name=ljp&pwd=ljp"; var t=ajax_post(url,data); alert(t);//在这里弹出undefined ============================= }

为什么会出现这个问题呢??因为在执行getData中的代码var t=ajax_post(url,data);时,由于指定了异步,所以callServerByPost中的http_request.send(data);//传送资料  这句话并不会中断其他js代码的执行,所以会继续执行getData中的下一句代码,就是alert(t),所以会出现undefined。

其实呢并不仅是ajax异步导致出现undefined的问题。认真看下代码var t=ajax_post(url,data);,t变量是接受的是ajax_post的返回值,但是ajax_post函数中并未使用return 返回任何值,所以默认是返回undefined。

你会说我这里不是使用了return http_request.responseText;//在这里明明调试时http_request.responseText已经有值但是在外边却接收不到返回了吗??????????

大家看清楚了,那个是状态转换函数,你返回任何值是没有意义的,他只是处理ajax的状态,你返回值给谁用的呢?????是不是。

如何解决这个问题呢?一种是改为同步发送,一种就是为异步时使用全局变量来接受ajax的返回值,在状态转换函数中给全局变量赋值。


使用异步+全局变量时要注意的是在ajax未返回前千万不用使用全局变量,要不还是undefined。

下面给出同步的解决办法。异步+全局变量的解决方法看这篇文章
为什么数组作为参数传递进去取不了值出来?

原本最后想放自己写的ajax对象应用池程序的,超过字符限制了,有兴趣可以去下载
下载地址
代码说明这里
回复次数:146
#1楼 得分:0回复于:2009-07-02 12:01:24
忘记放同步解决的代码了。。。。
JScript code
function callServerByPost(url,data,fun) { var http_request=null; if (window.ActiveXObject)http_request = new ActiveXObject("Microsoft.XMLHTTP"); }else if (window.XMLHttpRequest) http_request = new XMLHttpRequest(); if (!http_request) { alert('Giving up :Cannot create an XMLHTTP instance'); return false; } // http_request.onreadystatechange = fun; //为同步时不再需要处理函数了。。。。。。。 http_request.open("POST", url, false);//改为同步 http_request.setrequestheader("Content-length",data.length); http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); http_request.send(data);//传送资料 return http_request.responseText;//同步时可以直接返回,因为会阻止其他的代码执行 } function ajax_post(url,data) { url=url+"?t="+new Date(); return callServerByPost(url,data,null);//不需要传递回调,并且直接返回callServerByPost的返回值 } function getData(){ var url="ajax_server.aspx"; var data="name=ljp&pwd=ljp"; var t=ajax_post(url,data); alert(t);//这里就不会输出undefined了。。。。。。。。。。。。,不过如果网路慢的话,浏览器就假死了。。 }



还有一个问题忘记总结了,跨域的问题
如果请求的页面不是当前站点的,那就跨域了,最好的解决方案就是服务器端的xhr请求

可以参考下面的的解决方案
AJAX跨域问题解决办法

不久前放出的一个使用alexa,google的api获取alexa排名和google  pr,分别使用了客户端和服务器端的xhr请求
中就是使用了服务器端的xhr请求,应为请求的是Google和alexa的页面,所以跨域了,需要使用服务器端的xhr请求。
  • zq9811用户头像
  • zq9811
  • (该用户不懒,已设置昵称)
  • 等 级:
#2楼 得分:10回复于:2009-07-02 14:22:34
sc ding
#3楼 得分:10回复于:2009-07-02 15:11:03
支持总结
收藏学习
JF
#4楼 得分:10回复于:2009-07-02 15:25:59
感谢分享!好好学习。。。
#5楼 得分:0回复于:2009-07-02 15:36:00
mark
#6楼 得分:10回复于:2009-07-02 15:54:08
感谢分享
#7楼 得分:10回复于:2009-07-02 15:57:07
学习了啊,很全面
  • ws_hgo用户头像
  • ws_hgo
  • (蓝天白云--(全面提升!!))
  • 等 级:
#8楼 得分:10回复于:2009-07-02 16:04:09
又是一个精华帖
#9楼 得分:10回复于:2009-07-02 16:29:33
回复下~~~~~
#10楼 得分:10回复于:2009-07-02 16:51:49
不错!!!!!
#11楼 得分:10回复于:2009-07-02 16:56:30
好文,收藏!
#12楼 得分:10回复于:2009-07-02 17:01:43
谢谢分享...
#13楼 得分:10回复于:2009-07-02 17:02:01
谢谢分享。收藏了。呵呵
  • zxdldh007用户头像
  • zxdldh007
  • (滚滚红尘里的和尚)
  • 等 级:
#14楼 得分:10回复于:2009-07-02 17:03:17
up gaoman
  • ytfsse用户头像
  • ytfsse
  • (无声的落幕)
  • 等 级:
#15楼 得分:10回复于:2009-07-02 17:39:48
谢谢分享
#16楼 得分:10回复于:2009-07-02 17:39:50
Mark
#17楼 得分:10回复于:2009-07-02 17:55:08
好东西  值得研究研究  东西不错哦啊
#18楼 得分:10回复于:2009-07-02 18:06:50
mark!不错的说
#19楼 得分:10回复于:2009-07-02 18:20:38
.
#20楼 得分:10回复于:2009-07-02 18:26:44
~jF
  • wtcsy用户头像
  • wtcsy
  • (我是桃子)
  • 等 级:
#21楼 得分:10回复于:2009-07-02 18:38:54
UP
学习!~~~~~~~~
#22楼 得分:10回复于:2009-07-02 18:42:22
UP UP UP
谢谢分享,受益匪浅!
#23楼 得分:0回复于:2009-07-02 18:51:24
收藏一下
#24楼 得分:0回复于:2009-07-02 20:40:30



    嗯,不错!
  • swweb用户头像
  • swweb
  • (swweb)
  • 等 级:
#25楼 得分:0回复于:2009-07-02 23:23:59
很感谢楼主的分享!谢谢
#26楼 得分:0回复于:2009-07-03 07:51:26
up thank you
#27楼 得分:0回复于:2009-07-03 07:55:33
不错!
#28楼 得分:0回复于:2009-07-03 08:24:44
学习
#29楼 得分:0回复于:2009-07-03 08:25:47
感谢楼主啊,
  • gahyyai用户头像
  • gahyyai
  • (冰岛男孩)
  • 等 级:
#30楼 得分:0回复于:2009-07-03 08:28:09
mark
#31楼 得分:0回复于:2009-07-03 08:32:11
up
  • baba72用户头像
  • baba72
  • (baba72)
  • 等 级:
#32楼 得分:0回复于:2009-07-03 09:17:44
up
#33楼 得分:0回复于:2009-07-03 09:23:49
谢谢LZ分享。
#34楼 得分:0回复于:2009-07-03 09:24:03
感谢,收藏了……
#35楼 得分:0回复于:2009-07-03 09:32:23
看看
#36楼 得分:0回复于:2009-07-03 09:33:05
mark
#37楼 得分:0回复于:2009-07-03 09:58:49
感谢!!!
#38楼 得分:0回复于:2009-07-03 10:03:29
谢谢分享
#39楼 得分:0回复于:2009-07-03 10:06:46
学习
#40楼 得分:0回复于:2009-07-03 10:25:23
引用 20 楼 hookee 的回复:
~jF
只有引用的内容不允许回复!!
  • zq9811用户头像
  • zq9811
  • (该用户不懒,已设置昵称)
  • 等 级:
#41楼 得分:0回复于:2009-07-03 10:34:39
引用 40 楼 maximus_zhang 的回复:
引用 20 楼 hookee 的回复:
~jF

只有引用的内容不允许回复!!
#42楼 得分:0回复于:2009-07-03 10:34:50
这个帖子不错,要顶起
#43楼 得分:0回复于:2009-07-03 10:39:43
顶起,大部分的都遇到过,是很实际的一些问题,务实!
  • kx00450用户头像
  • kx00450
  • (一柱擎天)
  • 等 级:
#44楼 得分:0回复于:2009-07-03 10:41:05
收藏
#45楼 得分:0回复于:2009-07-03 10:57:56
学习!!!
#46楼 得分:0回复于:2009-07-03 11:06:29
经典
  • llynn用户头像
  • llynn
  • (llynn)
  • 等 级:
#47楼 得分:0回复于:2009-07-03 11:06:54
up~
#48楼 得分:0回复于:2009-07-03 11:07:11
JF~~~~
收藏之!
#49楼 得分:0回复于:2009-07-03 11:31:37
JF,顶,再收藏
#50楼 得分:0回复于:2009-07-03 12:10:09
我再给大家推荐一个:
http://www.126code.com/
语言:中文
简介:集结JAVA,PHP,JS,RUBY等开源项目,提供社区功能,注册后可以关注自己喜欢的项目,还可以为项目写文档,供他人阅读,供自己记录学习历程.
这个网站上有很多关于JS方面的知识.
#51楼 得分:0回复于:2009-07-03 12:49:10
接分~ 收藏~
#52楼 得分:0回复于:2009-07-03 13:00:32
精彩,收藏!!!
#53楼 得分:0回复于:2009-07-03 13:10:21
太好了,谢谢共享,收藏了
#54楼 得分:0回复于:2009-07-03 14:40:20
请问在asp.net中从数据库中查出一张表后得到datatable或者dateset,
怎样将一张表的数据转换为JSON呢?并传给前台ajax调用?
#55楼 得分:0回复于:2009-07-03 15:03:11
好东西!!
  • chouy用户头像
  • chouy
  • (chouy)
  • 等 级:
#56楼 得分:0回复于:2009-07-03 15:05:31
sign
#57楼 得分:0回复于:2009-07-03 15:43:23
辛苦了 哥们!
#58楼 得分:0回复于:2009-07-03 15:59:49
xuexile ,非常有价值
#59楼 得分:0回复于:2009-07-03 17:14:42
引用 54 楼 fly_to_the_winds 的回复:
请问在asp.net中从数据库中查出一张表后得到datatable或者dateset,
怎样将一张表的数据转换为JSON呢?并传给前台ajax调用?

C# code
/// <summary> /// 将SqlDataReader转化为JSON数组字符串 形如:[{key11:value11,key12:value12},{key2:value2}] /// </summary> /// <param name="reader">SqlDataReader</param> /// <returns>JSON数组字符串</returns> public static string ToJsonArray(SqlDataReader reader) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("["); while (reader.Read()) { stringBuilder.Append("{"); for (int i = 0; i < reader.FieldCount; i++) { stringBuilder.Append(reader.GetName(i)); stringBuilder.Append(":"); stringBuilder.Append("\""); stringBuilder.Append(reader[i].ToString()); stringBuilder.Append("\""); if (i != reader.FieldCount - 1) { stringBuilder.Append(","); } } stringBuilder.Append("},"); } if (stringBuilder.Length != 1) { stringBuilder.Remove(stringBuilder.Length - 1, 1); } stringBuilder.Append("]"); return stringBuilder.ToString(); } }


可以应付大多数简单的情况
#60楼 得分:0回复于:2009-07-03 18:01:19
非常好,,支持。。。
  • cchaha用户头像
  • cchaha
  • (河蟹社会,准时结贴)
  • 等 级:
#61楼 得分:0回复于:2009-07-03 18:05:01
不错,多谢分享
  • zhhmw用户头像
  • zhhmw
  • (爱你爱他到底谁爱我)
  • 等 级:
#62楼 得分:0回复于:2009-07-03 18:48:49
太牛了,真是牛人
#63楼 得分:0回复于:2009-07-03 19:25:07
大家要能顶我到200楼

我再放个ajax无刷新聊天室出来让大家帮我测试下,支持单独对话和群聊的的。

技术:ajax+ashx(C#)+mssql【为了提升速度使用了存储过程 】

哈哈~~~~~~
  • chh2008用户头像
  • chh2008
  • (simple?good:bad)
  • 等 级:
#64楼 得分:0回复于:2009-07-03 22:47:11
谢谢分享!!!!!!!!!!!!!!!!!!!!
好文,应顶到200楼
  • gsh945用户头像
  • gsh945
  • (郭大侠)
  • 等 级:
#65楼 得分:0回复于:2009-07-04 00:20:32
收藏了,真是个勤快人。
#66楼 得分:0回复于:2009-07-04 01:05:56
考走,see see
#67楼 得分:0回复于:2009-07-04 07:39:49
谢谢,学习
#68楼 得分:0回复于:2009-07-04 10:16:47
顶一下
  • zhangwenmin用户头像
  • zhangwenmin
  • (金鳞岂是池中物,一遇风雨便化龙)
  • 等 级:
#69楼 得分:0回复于:2009-07-04 10:29:38
不给分不行
#70楼 得分:0回复于:2009-07-04 11:31:01
mark
#71楼 得分:0回复于:2009-07-04 11:48:10
好,支持
  • fisea用户头像
  • fisea
  • (fisea)
  • 等 级:
#72楼 得分:0回复于:2009-07-04 18:10:24
ding
#73楼 得分:0回复于:2009-07-05 09:01:13
up
  • c6285用户头像
  • c6285
  • (司徒商)
  • 等 级:
#74楼 得分:0回复于:2009-07-06 17:11:01
MARK
#75楼 得分:0回复于:2009-07-06 17:30:24
#76楼 得分:0回复于:2009-07-06 17:42:48
精华。收藏
#77楼 得分:0回复于:2009-07-06 18:03:48
up
#78楼 得分:0回复于:2009-07-06 23:05:08
我收藏一下
  • lfywy用户头像
  • lfywy
  • (云中深海)
  • 等 级:
#79楼 得分:0回复于:2009-07-07 09:31:35
收藏
#80楼 得分:0回复于:2009-07-07 11:07:10
学习
#81楼 得分:0回复于:2009-07-08 10:35:33
mark 学习
#82楼 得分:0回复于:2009-07-08 11:38:26
学习下
#83楼 得分:0回复于:2009-07-08 13:25:43
学习.........
#84楼 得分:0回复于:2009-07-08 20:10:53
up up up
#85楼 得分:0回复于:2009-07-09 12:17:22
看看..
#86楼 得分:0回复于:2009-07-09 16:06:53
学习了
  • mykelly6用户头像
  • mykelly6
  • (突然发现头像没有下半身^..^)
  • 等 级:
#87楼 得分:0回复于:2009-07-10 13:09:02
marks
  • llynn用户头像
  • llynn
  • (llynn)
  • 等 级:
#88楼 得分:0回复于:2009-07-10 20:26:33
收藏
#89楼 得分:0回复于:2009-07-10 20:57:52
建议加精谢谢收藏了
#90楼 得分:0回复于:2009-07-11 22:04:09
好东西,支持下!
#91楼 得分:0回复于:2009-07-12 16:40:55
嗯,收藏了,正在学习ajax中
  • ya270078781用户头像
  • ya270078781
  • (我想早恋,但是已经晚了…… )
  • 等 级:
#92楼 得分:0回复于:2009-07-12 16:46:25
感谢楼主无私分享!
JF
#94楼 得分:0回复于:2009-07-14 12:41:48
好东西!顶~~~
#95楼 得分:0回复于:2009-07-14 13:20:52
支持!学习
#96楼 得分:0回复于:2009-07-15 10:22:36
好东东...学习,收藏了.
  • Skight用户头像
  • Skight
  • (Hesung Master)
  • 等 级:
#97楼 得分:0回复于:2009-07-16 12:28:25
不错,谢谢。
#98楼 得分:0回复于:2009-07-16 15:30:19
学习
  • lin186用户头像
  • lin186
  • (lin186)
  • 等 级:
#99楼 得分:0回复于:2009-07-16 16:26:08
学习中, JF
#100楼 得分:0回复于:2009-07-16 16:29:15
我来顶上100
呵呵
相关问题
[总结]ajax问题总结
web ajax应用国际化、乱码问题总结
php可不可以在服务器端查出AJAX异步请求的URL地址呢
求助高手Ajax 在Firefox和Chrome中的兼容问题
所有页面都是UTF-8 AJAX请求都用了encodeURIComponent 为什么数据库遇 ...
AJAX目前弊端的总结! Web 开发/ Ajax - CSDN社区community.csdn.net