在使用Ajax过程当中,有时候总会遇到一些难题,浏览器兼容、编码、IE下的特殊处理等等,偶尔会搞的人头昏脑胀啼笑皆非,这里列一些小贴士,或许有些用。
使用Javascript库
Ajax的流行和巨大威力,让咱们从新审视了Javascript的开发,也直接促使各类库的出现。对于普通的开发者,使用一些适合本身的Javascript库不只能够避免Ajax应用上的浏览器兼容等问题,也使其开发更加的稳定和高效。这里列一些我知晓的轻量级的Javascript库:
- YUI:YAHOO出品,组件丰富强大健壮稳定,是团队协做开发的首选。
- JQuery:灵活、高效,其基于CSS3 和XPath的选择器语法引擎很是的强大和完整。
- Prototype:是一个很是优雅的Javascript库,最经典的莫过于$符号了,DWR,JQuery都被它吸引了。在它基础上出现了script.aculo.us。
- Mootools:核心语法和Prototype比较相似,可是用过以后才知道什么叫简单轻巧和短小精悍。
编码问题
经过XMLHttpRequest获取的数据,默认的字符编码是UTF-8,若是前端页面是GB2312或者其它编码,显示获取的数据就是乱码。经过XMLHTTPRequest,POST的数据也是UTF-8编码,若是后台是GB2312或者其余编码也会出现乱码。解决方法:
- 统一到UTF-8。这也是国际化的必然趋势。
- 输出经过XMLHttpRequest获取的文本文本时,在headers中增长文本声明(直接HTML声明没有做用)。如:
PHP:header('Content-Type:text/html;charset=GB2312');
ASP:Response.Charset = "GB2312"
JSP:response.setHeader("Charset","GB2312");
- WWW服务器上强制声明。好比:apache下的配置:
AddDefaultCharset GB2312
这种状况主要是应对经过XMLHttpRequest访问的文件是静态文件,没法声明headers的状况下。
静态页面通常都会通过Apache的deflate或gzip压缩,此时在上面状况下IE中,首次经过XMLhttpRequest得到的数据能够正常显示,但再获取数据显示时出现乱码,此次由于再次获取的数据来自缓存,可能因为浏览器解压缩的问题致使Apache设置的默认编码声明丢失。因为这种状况下通常是纯文本,可能还没法禁止缓存,能够设置XMLhttpRequest访问的文本文件不压缩来解决这个问题。
- 非UTF-8页面经过XMLHttpRequest获取的文本文本输出前字符转码成unicode,或者编码直接是UTF-8,能够正常显示。如实例所示。
IE下的缓存问题
因为IE的缓存处理机制问题,每次经过XMLHttpRequest访问动态页面返回的老是首次访问的内容,解决方法有:
- 客户端经过添加随机字符串解决。如:
var url = 'http://dancewithnet.com/';
url += '?temp=' + new Date().getTime();
url += '?temp=' + Math.random();
- 在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");
- 在XMLHttpRequest发送请求以前加上:
XMLHttpRequest.setRequestHeader("If-Modified-Since","0");
XMLHttpRequest.send(null);
IE下的reponseXML问题
使用responseXML时,IE下只能接受.xml为后缀的XML文件,若是不能以.xml文件为结尾的,则须要以下处理:
- 在服务器端声明是xml文件类型。如:
PHP:header("Content-Type:text/xml;charset=utf-8");
ASP:Response.ContentType = "text/xml";
JSP:response.setHeader("ContentType","text/xml");
- 利用responseText获取,而后封装成XML。
- 在AJAX应用上,JSON和JsonML是XML很是好的替代品。