鸟食轩

 Microsoft .NET[C#] MVP 2003
随笔 - 424, 文章 - 233, 评论 - 5417, 引用 - 344
数据加载中……

对Web页面元素的绝对唯一引用方法

    我们知道要在Web页面中引用一个HTML元素,最简单的方法就是使用getElementById方法,或其类似的一组getElementsByXxx方法。可是这里需要注意的是,这些方法其实都不能完全绝对的唯一确定对一个元素的引用。

    至于getElementsByXxx我们不说了,它本身就是getElements,很明白了,那么getElementById也不能唯一确定一个元素吗?当然是,不能。由于html的不严格性,在同一页面中重复元素的id是被允许的。关于id的更多细节问题,请参考:
细说HTML元素的ID和Name属性的区别,一文。

    那么怎么才能唯一的确定对一个元素的引用呢?使用DOM之间的引用结构来查找?这个方法虽然是行的,但是可操作性是在是太差了。这里需要说说我原来介绍过的html属性
uniqueID,它是微软为HTML元素扩充的专有属性,不遵循W3C的规范。这个uniqueID有一些undocumented的特性,uniqueID其实也是和id类似的一套元素表示体系,只是它是纯客户端的标示方案。它的一些细节在前面一个链接中已经介绍了,下面我们主要说说它的特性。

    由于它是元素的表示体系,那么它也因该和id的特性一样啰?实际上确实是这样,除了uniqueID的生成方式和id完全不同外,uniqueID其它表现和id是一样的。我们可以通过这个uniqueID直接引用元素,就像id一样,只是由于uniqueID是动态生成的,所以我们也只能动态使用这个uniqueID,而不能以literal形式来使用。下面是一个使用示例:
var g_ELEMENTS = {};
var span =
 document.createElement('SPAN');
document.body.appendChild(span);
g_ELEMENTS[span.uniqueID] 
= span;

    这样我们就通过uniqueID将span缓存起来了,已有要引用这个span,就可以这样:
var elements = g_ELEMENTS.GetExpandoKeys();
for ( var i=0 ; i < elements.length ; ++
i )
{
    
var element =
 eval(elmenets[i]);
    
// todo: other logic

}

    除了使用eval来引用这个uniqueID外,getElementById也有一个undocumented的特性,就是它也支持uniqueID,这样一来,我们就可以使用getElementById(elements[i])来绝对唯一的引用一个页面元素。

    可能有人会疑惑,这个uniqueID到底有什么用啊?其实在动态生成大量页面元素时,使用uniqueID可以非常方面的为元素生成真正的unique的id,它的意义就在于可以将这些动态元素cache起来,做统一管理。特别是在实现动态在的TreeView时,如果合理使用uniqueID到来的好处,就可以避免很多需要对树进行反复递归便利才能完成的工作。还有,uniqueID是IE的DOM提供的原生解决方案,比自己去做unique标示要方面高效的多,并且还利于对元素检索。

    参考信息:
GetExpandoKeys(),另外就是本文不适合FireFox及其它非IE内核浏览器。

posted on 2006-09-28 20:16 birdshome 阅读(4700) 评论(8)  编辑 收藏 所属分类: Jscript&Dhtml开发

评论

#1楼    回复  引用  查看    

其实现在如果不兼容FireFox的方法就不能被使用啊……
除非写一些确定在只会在IE下使用的页面,比如一些软件可以做内嵌页面等等。
2006-09-28 21:00 | Jeffrey Zhao      

#2楼    回复  引用  查看    

不赞成使用这个。为了兼容性,微软自己的产品都不这样用了.
2006-09-29 10:45 | 维生素C.NET      

#3楼    回复  引用  查看    

恩,权衡下肯定兼容FF是首要考虑的。
2006-09-29 11:40 | 差劲的程序员      

#4楼    回复  引用    

木 有办法……
2006-09-30 10:17 | gouki [未注册用户]

#5楼    回复  引用    

同一页面中重复元素的id是被允许的

这是你自己写法的问题,你写成一个ID不好么?

#6楼    回复  引用    

绝对唯一的标记应该是

HTMLElement.sourceIndex 这个才是绝对无重复标识
2006-11-22 08:38 | gzljy [未注册用户]

#7楼    回复  引用    

如果对唯一性要求不太高,自己写个

function keyCode(pix)
{
this.pix=pix;
}
keyCode.k=0;
keyCode.prototype.getKey=function()
{
keyCode.k++;
return this.pix+keyCode.k;
}
var k=new keyCode('abc');
alert(k.getKey());
alert(k.getKey());
alert(k.getKey());
alert(k.getKey());
alert(k.getKey());
2007-07-20 17:19 | igyhi [未注册用户]

#8楼    回复  引用    

晕!~
这样子的问题,不应该这么讲的。
微软的这种绝对唯一无非就是多加一个工作了。

如果IE或者是其他浏览器也针对这种HTML解析加一个绝对唯一的标识的话,那估计又得乱了,倒还不如自己写的时候在页面中注意对id的使用了,因为在W3C标准中对于这个标识的用法是唯一,要不你可以去验证下。
2008-07-18 15:40 | 五大郎 [未注册用户]

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-09-28 21:25 编辑过


相关链接:

历史上的今天:
2005-09-28 我们到底要还是不要Ajax是一个问题