Ajax的小贴士使用小结
程序员文章站
2022-09-01 23:53:35
在使用ajax过程中,有时候总会遇到一些难题,浏览器兼容、编码、ie下的特殊处理等等,偶尔会搞的人头昏脑胀哭笑不得,这里列一些小贴士,或许有些用。 使用java...
在使用ajax过程中,有时候总会遇到一些难题,浏览器兼容、编码、ie下的特殊处理等等,偶尔会搞的人头昏脑胀哭笑不得,这里列一些小贴士,或许有些用。
使用javascript库
ajax的流行和巨大威力,让我们重新审视了javascript的开发,也直接促使各种库的出现。对于普通的开发者,使用一些适合自己的javascript库不仅可以避免ajax应用上的浏览器兼容等问题,也使其开发更加的稳定和高效。这里列一些我知晓的轻量级的javascript库:
1 yui:yahoo出品,组件丰富强大健壮稳定,是团队协作开发的首选。
2 jquery:灵活、高效,其基于css3 和xpath的选择器语法引擎非常的强大和完整。
3 prototype:是一个非常优雅的javascript库,最经典的莫过于$符号了,dwr,jquery都被它吸引了。在它基础上出现了script.aculo.us。
4 mootools:核心语法和prototype比较类似,但是用过之后才知道什么叫简单轻巧和短小精悍。
编码问题
通过xmlhttprequest获取的数据,默认的字符编码是utf-8,如果前端页面是gb2312或者其它编码,显示获取的数据就是乱码。通过xmlhttprequest,post的数据也是utf-8编码,如果后台是gb2312或者其他编码也会出现乱码。解决方法:
1 统一到utf-8。这也是国际化的必然趋势。
2 输出通过xmlhttprequest获取的文本文本时,在headers中增加文本声明(直接html声明没有作用)。如:
php:header('content-type:text/html;charset=gb2312');
asp:response.charset = "gb2312"
jsp:response.setheader("charset","gb2312");
3 www服务器上强制声明。比如:apache下的配置:
adddefaultcharset gb2312
这种情况主要是应对通过xmlhttprequest访问的文件是静态文件,无法声明headers的情况下。
静态页面一般都会经过apache的deflate或gzip压缩,此时在上面情况下ie中,首次通过xmlhttprequest获得的数据可以正常显示,但再获取数据显示时出现乱码,这次因为再次获取的数据来自缓存,可能由于浏览器解压缩的问题导致apache设置的默认编码声明丢失。由于这种情况下一般是纯文本,可能还无法禁止缓存,可以设置xmlhttprequest访问的文本文件不压缩来解决这个问题。
4 非utf-8页面通过xmlhttprequest获取的文本文本输出前字符转码成unicode,或者编码直接是utf-8,可以正常显示。如实例所示。
ie下的缓存问题
由于ie的缓存处理机制问题,每次通过xmlhttprequest访问动态页面返回的总是首次访问的内容,解决方法有:
1 客户端通过添加随机字符串解决。如:
var url = 'http://dancewithnet.com/';
url += '?temp=' + new date().gettime();
url += '?temp=' + math.random();
2 在http headers禁止缓存。如:
http:
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache, must-revalidate" />
<meta http-equiv="expires" content="thu, 01 jan 1970 00:00:01 gmt" />
<meta http-equiv="expires" content="0" />
php:
header("expires: thu, 01 jan 1970 00:00:01 gmt");
header("cache-control: no-cache, must-revalidate");
header("pragma: no-cache");
asp:
response.expires=0
response.addheader("pragma","no-cache")
response.addheader("cache-control","no-cache, must-revalidate")
jsp:
response.addheader("cache-control", "no-cache");
response.addheader("expires", "thu, 01 jan 1970 00:00:01 gmt");
ie下的reponsexml问题
使用responsexml时,ie下只能接受.xml为后缀的xml文件,如果不能以.xml文件为结尾的,则需要如下处理:
1 在服务器端声明是xml文件类型。如:
php:header("content-type:text/xml;charset=utf-8");
asp:response.contenttype = "text/xml";
jsp:response.setheader("contenttype","text/xml");
2 利用responsetext获取,然后封装成xml。
3 在ajax应用上,json和jsonml是xml非常好的替代品。
使用javascript库
ajax的流行和巨大威力,让我们重新审视了javascript的开发,也直接促使各种库的出现。对于普通的开发者,使用一些适合自己的javascript库不仅可以避免ajax应用上的浏览器兼容等问题,也使其开发更加的稳定和高效。这里列一些我知晓的轻量级的javascript库:
1 yui:yahoo出品,组件丰富强大健壮稳定,是团队协作开发的首选。
2 jquery:灵活、高效,其基于css3 和xpath的选择器语法引擎非常的强大和完整。
3 prototype:是一个非常优雅的javascript库,最经典的莫过于$符号了,dwr,jquery都被它吸引了。在它基础上出现了script.aculo.us。
4 mootools:核心语法和prototype比较类似,但是用过之后才知道什么叫简单轻巧和短小精悍。
编码问题
通过xmlhttprequest获取的数据,默认的字符编码是utf-8,如果前端页面是gb2312或者其它编码,显示获取的数据就是乱码。通过xmlhttprequest,post的数据也是utf-8编码,如果后台是gb2312或者其他编码也会出现乱码。解决方法:
1 统一到utf-8。这也是国际化的必然趋势。
2 输出通过xmlhttprequest获取的文本文本时,在headers中增加文本声明(直接html声明没有作用)。如:
php:header('content-type:text/html;charset=gb2312');
asp:response.charset = "gb2312"
jsp:response.setheader("charset","gb2312");
3 www服务器上强制声明。比如:apache下的配置:
adddefaultcharset gb2312
这种情况主要是应对通过xmlhttprequest访问的文件是静态文件,无法声明headers的情况下。
静态页面一般都会经过apache的deflate或gzip压缩,此时在上面情况下ie中,首次通过xmlhttprequest获得的数据可以正常显示,但再获取数据显示时出现乱码,这次因为再次获取的数据来自缓存,可能由于浏览器解压缩的问题导致apache设置的默认编码声明丢失。由于这种情况下一般是纯文本,可能还无法禁止缓存,可以设置xmlhttprequest访问的文本文件不压缩来解决这个问题。
4 非utf-8页面通过xmlhttprequest获取的文本文本输出前字符转码成unicode,或者编码直接是utf-8,可以正常显示。如实例所示。
ie下的缓存问题
由于ie的缓存处理机制问题,每次通过xmlhttprequest访问动态页面返回的总是首次访问的内容,解决方法有:
1 客户端通过添加随机字符串解决。如:
复制代码 代码如下:
var url = 'http://dancewithnet.com/';
url += '?temp=' + new date().gettime();
url += '?temp=' + math.random();
2 在http headers禁止缓存。如:
http:
复制代码 代码如下:
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache, must-revalidate" />
<meta http-equiv="expires" content="thu, 01 jan 1970 00:00:01 gmt" />
<meta http-equiv="expires" content="0" />
php:
复制代码 代码如下:
header("expires: thu, 01 jan 1970 00:00:01 gmt");
header("cache-control: no-cache, must-revalidate");
header("pragma: no-cache");
asp:
复制代码 代码如下:
response.expires=0
response.addheader("pragma","no-cache")
response.addheader("cache-control","no-cache, must-revalidate")
jsp:
复制代码 代码如下:
response.addheader("cache-control", "no-cache");
response.addheader("expires", "thu, 01 jan 1970 00:00:01 gmt");
ie下的reponsexml问题
使用responsexml时,ie下只能接受.xml为后缀的xml文件,如果不能以.xml文件为结尾的,则需要如下处理:
1 在服务器端声明是xml文件类型。如:
php:header("content-type:text/xml;charset=utf-8");
asp:response.contenttype = "text/xml";
jsp:response.setheader("contenttype","text/xml");
2 利用responsetext获取,然后封装成xml。
3 在ajax应用上,json和jsonml是xml非常好的替代品。