主题:  浅谈HTML中NAME和ID的区别

不是高手

职务:普通成员
等级:3
金币:5.0
发贴:1352
#12005/1/28 10:45:41
对于刚刚接触HTML源代码的朋友可能有这样一个疑惑:在一个表单元素中,我如果想用脚本确定某个具体元素,我既可以用他的NAME来索引这个对象,也可以加一个ID来索引它,那这两种方法究竟有什么区别呢?以下我们来具体探讨一下,鉴于本人水平有限,如有描述不当,恳请指教。

我们可以通过一段代码来分析一下其中的微妙差别:
<form method="post" action="" name="demoform">
<input type="text" name="oDemo" id=”oDemo2” value="DEMO" />
</form>


在IE浏览器里,我们可以通过多少方法来索引到这个文本框对象?(为区别起见,我们把NAME和ID设成了不同的值)
1. oDemo
2. demoform.oDemo
3. document.all.oDemo
4. document.all.demoform.oDemo
5. document.forms[0].oDemo
6. document.forms['demoform'].oDemo
7. document.forms['demoform'].childNodes[0]
8. document.forms['demoform'].elements[0]
9. document.getElementById('oDemo2')


以上9种索引方法在IE6里面全部通过返回值测试,不过值得注意的是最后一种:在IE6里,我把索引对象写成document.getElementById('oDemo'),浏览器也能正确索引到对象,真是可怕的容错性啊!!

接着问题来了,我们把这段代码放在Mozilla Firefox 1.0里再执行一次,只有第7种方法返回“undefined”,其他的方法可以正确索引到对象,不过由于第3、4种方法用到了document.all这个IE专有对象,FF1.0虽然返回了正确的值,不过却在控制台里发出了警告:警告:非标准的属性 document.all。请使用 W3C 的标准形式 document.getElementById()

接下来我们把HTML文本类型定义得严格一点,在源代码开头加上:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
使HTML文本按照HTML4.01标准去解析,在IE6里照样全部通过返回值测试,不过在Mozilla Firefox 1.0里麻烦就大了,第3、4种方法没有任何的返回值,而在控制台里发出了报错信息:错误: document.all has no properties ,而第7种方法依旧返回“undefined”。

小 结
NAME主要应用在交互式网页,表单提交给某个服务器端脚本后接收变处理量使用。从源代码的规范性和兼容性角度出发,如在客户端脚本里要索引某个对象,建议用document.getElementById()方法,尽量不要直接使用NAME的值,当然如果不考虑兼容性,以上9种方法都可以在IE里运行通过(IE5.0没测试过)。

附:测试源代码


[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]



{ 在指尖上绽放的花朵 }

职务:普通成员
等级:5
金币:14.0
发贴:3209
#22005/1/28 11:16:08
IE 5.0 九个方法全部可以正确返回测试值。。。。

晚些时候给出NN的测试结果。。。



不是高手

职务:普通成员
等级:3
金币:5.0
发贴:1352
#32005/1/28 12:39:02
哦,呵呵,好啊,谢谢楼上



我佛山人

职务:版主
等级:4
金币:16.0
发贴:2269
#42005/1/29 23:46:07
还有一个M$的document.getElementsByName

Name只能用于表单、框架和链接,ID可用于所有HTML对象



counterm

职务:普通成员
等级:1
金币:0.0
发贴:19
#52005/1/30 21:56:01
namedItem呢?



不是高手

职务:普通成员
等级:3
金币:5.0
发贴:1352
#62005/1/31 10:17:37
我佛山人在上个帖子中说
引用:
还有一个M$的document.getElementsByName

Name只能用于表单、框架和链接,ID可用于所有HTML对象


W3C标准里,NAME在同一页面里可以用于多个TAG,而ID只能有唯一一个,不然FF会报错



jiarry

职务:普通成员
等级:1
金币:0.0
发贴:8
#72005/2/1 14:08:10
说的正确,现在如果用event.keyCode来调用键盘操作,在firefox里也会出错。那请问在firefox里究竟该如何调用键盘呢?



不是高手

职务:普通成员
等级:3
金币:5.0
发贴:1352
#82005/2/2 15:04:56
firefox好像不支持event对象,你就不能用鸟~~~~