近期仿照GOOGLE给自己维护的邮箱系统中添加地址栏的自动完成功能,开发是采用javascript+XMLHTTP+DOM来实现,在开发过程中发现了几个需要要注意到问题,在此记录下来:
1. 首先关于XMLHTTP对象的创建的问题
浏览器到不同决定了XMLHTTP对象的创建方式不同,不过目前流行的浏览器无外乎IE6,IE7,FIREFOX以及其他基于IE内核的浏览器,根据自己在不同浏览器器中的实验,并参考了网上的N多方法,使用了一个比较通用的创建方法,基本上在目前的浏览器中都可正常创建XMLHTTP对象:
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP") ;
}
catch(e)
{
try
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP") ;
} catch(oc)
{
xmlHttp=null ;
}
}
if ( !xmlHttp && typeof XMLHttpRequest != "undefined" )
{
xmlHttp=new XMLHttpRequest() ;//此处一般适用于IE7或者FIREFOX,IE7虽然支持XMLHTTP activex,但是需要修改安全限制,不如直接使用XMLHttpRequest对象。
}
2. 引用URL的问题
使用XMLHTTP对象GET或POST一个URL时,由于浏览器到安全限制,该URL必须与使用该对象脚本的网页在同一域内才行(域名相同即可,忽略端口跟路径);firefox的限制要更严格一些,不仅仅域名相同,还要求端口号、路径都相同。
3. XMLHTTP获取的响应内容中中文的处理问题
对于FIREFOX这类浏览器,可以通过 .overrideMimeType("text/html; charset=gb2312") 的设置从responseText中获得正确的中文编码内容,这个方法不适用于通过ActiveXObject来创建的XMLHTTP对象。通过ActiveXObject创建的对象需要通过VBS写的一个转换函数把responseBody转换成中文编码内容,函数如下:
function gb2utf8(data)
{
var glbEncode = [];
gb2utf8_data = data;
execScript("gb2utf8_data = MidB(gb2utf8_data, 1)", "VBScript");
var t=escape(gb2utf8_data).replace(/%u/g,"").replace(/(.{2})(.{2})/g,"%$2%$1").replace(/%([A-Z].)%(.{2})/g,"@$1$2");
t=t.split("@");
var i=0,j=t.length,k;
while(++i<j)
{
k=t[i].substring(0,4);
if(!glbEncode[k])
{
gb2utf8_char = eval("0x"+k);
ExecScript("gb2utf8_char = Chr(gb2utf8_char)", "VBScript");
glbEncode[k]=escape(gb2utf8_char).substring(1,6);
}
t[i]=glbEncode[k]+t[i].substring(4);
}
gb2utf8_data = gb2utf8_char = null;
return unescape(t.join("%"));
}
4.获得页面内控件的位置信息的函数
function getoffset(e)
{
var t=e.offsetTop;
var l=e.offsetLeft;
while(e=e.offsetParent)
{
t+=e.offsetTop;
l+=e.offsetLeft;
}
var rec = new Array(1);
rec[0] = t;
rec[1] = l;
return rec;
}