开发自动完成功能中遇到的几个问题---javascript+XMLHTTP+DOM
2008-01-16 14:56
537 查看
近期仿照GOOGLE给自己维护的邮箱系统中添加地址栏的自动完成功能,开发是采用javascript+XMLHTTP+DOM来实现,在开发过程中发现了几个需要要注意到问题,在此记录下来:
[b]1. 首先关于XMLHTTP对象的创建的问题[/b]
浏览器到不同决定了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的限制要更严格一些,不仅仅域名相同,还要求端口号、路径都相同。
[b]3. XMLHTTP获取的响应内容中中文的处理问题[/b]
对于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("%"));
}
[b]4.获得页面内控件的位置信息的函数
[/b]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;
}
[b]1. 首先关于XMLHTTP对象的创建的问题[/b]
浏览器到不同决定了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的限制要更严格一些,不仅仅域名相同,还要求端口号、路径都相同。
[b]3. XMLHTTP获取的响应内容中中文的处理问题[/b]
对于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("%"));
}
[b]4.获得页面内控件的位置信息的函数
[/b]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;
}
相关文章推荐
- 使用xmlHttpRequest对象完成异步交互时,遇到的问题
- 使用Ajax技术通过XMLHttpRequest对象完成首页登录功能
- 使用ArcGIS GP服务遇到的问题,原因以及解决方法 - 客户端API开发(Javascript/Flex/Silverlig 转载
- 遇到几个问题:1.昨天还能连上数据库,今天不能;2.mysql服务自动停止
- eclipse开发jsp遇到的几个问题
- 今天跟新AS和NDK开发遇到几个很骚的问题
- 总结Java+Oracle应用开发的常遇到几个问题
- 贴吧系统开发中遇到的几个问题——数据传输限制
- Android开发之多线程中实现利用自定义控件绘制小球并完成小球自动下落功能实例
- Silverlight开发中遇到的几个小问题
- dwz问题(本文主要是供个人学习成长之用,陈述的是本人在开发过程中遇到的几个小问题的总结,可能兼或插入一些网络资料)
- 学习jni开发遇到的几个问题
- Eclipse Android开发遇到:"The type org.apache.http.HttpResponse cannot be resolved."问题的解决办法
- [转]如何在C#中开发来电显示功能遇到的问题
- IOS应用内购买(IAP)开发时遇到的几个问题总结
- 利用aop完成功能权限验证遇到的问题
- iphone 开发中使用zbar时遇到的几个典型问题解决方法。
- 初次开发Android APP遇到的几个问题及其解决
- 实时嵌入式开发中遇到的几个非典型问题
- 使用ASP.NET Atlas AutoComplete Behavior或AutoComplete Extender实现自动完成功能(上) 【转自http://dflying.cnblogs.com】