id的兄弟—uniqueID

来源:互联网 发布:梁朝伟刘嘉玲 知乎 编辑:程序博客网 时间:2024/05/16 15:26

        众所周知,id是不可以重复的,但是现在的浏览器对重复的id都是默许的,且ID属性是可写的,这往往造成人们对其重复性的误用。不过,IE对格式混乱(不完整的或有错嵌套关系)的HTML代码由极好的容错性,且看以下实例:

<divid="div_1">玛雅人是大忽悠</div>

 <divid="div_1">玛雅人还是大忽悠</div>

 <div id="div_1">玛雅人依旧是大忽悠</div>

这时div_1变成了一个数组,包含两个元素,并按3个DIV元素在DHTML对象树种出现的次序排序,而非对div的引用了。

    很显然,理论和现实有时真得是差十万八千里,说好的id唯一性呢???

这个时候,作为IE浏览器为页面上的所有元素提供的唯一名称——uniqueID酱登场了

注意:它是微软为HTML元素扩充的专有属性,不遵循W3C的规范)。

让我们来看下他的简历:

 

1. 采用lazy initialize技术

(本身不提供default的值,即IE在解析完HTML代码构建了DHMTL树后,并不会给HTML元素分配uniqueID。而需要我们去访问了HTML元素的uniqueID属性后,才会为其生成这个uniqueID的值。)

 

2.       Id格式为:ms__id\d+

 

3.readonly

(只读:搞 IT的应该太熟悉该英文了)

 

4.document的属性之一

(不过它和其它HTML的uniqueID属性的意义是完全不同的。当我们每调用一次document.uniqueID,系统就会返回一个新的uniqueID值)

 

5.与id同属一套元素表示体系

(只是这个uniqueID有一些undocumented的特性,是纯客户端的标示方案。)

 

6. 生成方式和id完全不同外,其它表现和id是一样的

 

我们可以通过这个uniqueID直接引用元素,就像id一样,只是由于uniqueID是动态生成的,所以我们也只能动态使用这个uniqueID,而不能以literal形式来使用。下面是一个使用示例:

var uniqueID = {};
var span = document.createElement('span');
document.body.appendChild(span);
 uniqueID [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的好处:

 

1 为元素生成真正的unique的id

 

2将动态元素cache起来,做统一管理。

(特别是在实现动态在的TreeView时,如果合理使用uniqueID到来的好处避免很多需要对树进行反复递归遍历才能完成的工作)

 

3 uniqueID是IE的DOM提供的原生解决方案

(比自己去做unique标示要方面高效的多)

 

4利于对元素检索。

 

ie能识别出名为uniqueID的document对象的专用属性,名为uniqueID,ie是唯一能够识别这个属性的浏览器,所以uniqueID很适合用来确定脚本是不是在Ie中运行。

 

 

 

 该文总结于多篇网上的博文~


原创粉丝点击