鸟食轩
Microsoft .NET[C#] MVP 2003
随笔 - 332, 文章 - 870, 评论 - 5722, 引用 - 356
对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
阅读(5349)
评论(8)
编辑
收藏
评论
1260218
#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不好么?
2006-10-26 15:38
|
寻梦的稻草人[未注册用户]
#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
|
五大郎[未注册用户]
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
微软任命新全球公共业务部门副总裁
·
职业社交网LinkedIn拟在移动应用中植入广告
·
企业微博:信息流通以人为本
·
分析师称谷歌进军硬件领域没有好结果
·
三十秒带你看尽每一款苹果产品,每一款NeXT产品
»
更多新闻...
最新知识库文章
:
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
·
前端必读:浏览器内部工作原理
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
导航
博客园
首页
新随笔
联系
订阅
管理
公告
Invert
原创
技术文章和心得,
转载
必须注明来源
"博客园"
!
贴子以"现状"提供,且没有任何担保,同时也没有授予任何权利。
昵称:
birdshome
园龄:
7年10个月
荣誉:
推荐博客
粉丝:
73
关注:
3
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
我的标签
Nokia 6300
(2)
fan
(1)
qq
(1)
腾讯
(1)
输入法
(1)
隐私
(1)
随笔分类
(337)
.NET的私有工具类(2)
(rss)
.NET技术开发相关(34)
(rss)
Asp.net控件开发(14)
(rss)
Debug中的滑铁卢(9)
(rss)
Enjoy Computer :)(27)
(rss)
Jscript&Dhtml开发(162)
(rss)
技术区里的非技术(49)
(rss)
开发中遇到的虫子(14)
(rss)
其它编程相关内容(16)
(rss)
商务智能(BI)开发(10)
(rss)
文章分类
(147)
北京的幸福生活(29)
(rss)
不得不转载(19)
(rss)
乖乖的文章(6)
(rss)
那时还没有blog(4)
(rss)
那是相当八卦(10)
(rss)
手机短信息(1)
(rss)
我们的文章(40)
(rss)
珍贵照片的背景(4)
(rss)
重庆的幸福生活(34)
(rss)
相册
2005 Kick Off @ 涞滩
2006 Kick Off @ 钓鱼城
2006 Offsite @ 四面山
2006 Wedding @ 昆明
2007 Marriage @ 哈尔滨
2007 Offsite @ Thailand
2007 Offsite @ 海南云天
2007 Training @ Seattle
2007 Travelling @ 云南
2008 Travelling @ 天津
乱七八糟的收集
Ex-Colleagues
Jason Lei's Space
.Net Life
(rss)
Jasper
(rss)
Michelles Space
xingd.net
(rss)
玻璃缸
(rss)
短鲷生活
海阔天空
录一室
(rss)
完美的泡菜
(rss)
怡红公子
(rss)
竹叶尖的BLOG
常用链接
Engadget 中文版
PDFCHM eBooks
SitePoint Forums
The Code Project
安利上海直销店
哈尔滨工业大学
哈工大紫丁香
海归论坛
(rss)
沙坪坝区中医院
兄弟情深
没有可乐的日子
葡萄树下不乘凉
(rss)
斯普特尼克
猪头小队长
(rss)
积分与排名
积分 - 3145044
排名 - 6
最新评论
阅读排行榜
推荐排行榜