开发自动完成功能中遇到的几个问题---javascript+XMLHTTP+DOM

近期仿照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;
}   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值