阅读:24940回复:32
ie和firefox中的getElementsByName的不同[转载,遇到同样的问题]
ie和firefox中的getElementsByName的不同[转载,遇到同样的问题]
http://blog.donews.com/gzpbx/archive/2005/06/30/448968.aspx ie和firefox中的getElementsByName的不同 http://layout.mblogger.cn/posts/12331.aspx 在ie 中getElementsByName(“test“)的时候返回的居然是id=test的object数组,而使用firefox则返回的是name= test的object的数组。按照w3c的规范应该是firefox的实现是正确的,只是不解ie为什么要实现成为id=test的方式呢?“根据 NAME 标签属性的值获取对象的集合。” firefox和ie中的getElementByID倒是相同:获取对 ID 标签属性为指定值的第一个对象的引用。 以上转载,但这个问题我也遇到了,我就在TR中同时加上id 和 name,这样都可以用了~ |
|
|
1楼#
发布于:2005-07-20 11:39
在兼容 name 及 id attribute 的 tag,你可以用 name=test 或 id=test, IE 都可以用getElementsByName 返回。
id 和 name 目的都是用名字返回 object,本身就是功能重叠。在未有 W3C 标准前, IE 用 all 就已经可以返回。 |
|
|
2楼#
发布于:2005-07-20 11:39
尽量使用getElementsById,IE似乎对getElementsByName的解释有问题,我几乎不用它.
|
|
3楼#
发布于:2005-07-20 11:39
|
|
4楼#
发布于:2005-07-20 11:39
这是W3C为DOM LV2定义的文档对象接口,我没有看到getElementsByName,呵呵,不知道为什么会有人把它扯到标准上面?
interface Document : Node { readonly attribute DocumentType doctype; readonly attribute DOMImplementation implementation; readonly attribute Element documentElement; Element createElement(in DOMString tagName) raises(DOMException); DocumentFragment createDocumentFragment(); Text createTextNode(in DOMString data); Comment createComment(in DOMString data); CDATASection createCDATASection(in DOMString data) raises(DOMException); ProcessingInstruction createProcessingInstruction(in DOMString target, in DOMString data) raises(DOMException); Attr createAttribute(in DOMString name) raises(DOMException); EntityReference createEntityReference(in DOMString name) raises(DOMException); NodeList getElementsByTagName(in DOMString tagname); // Introduced in DOM Level 2: Node importNode(in Node importedNode, in boolean deep) raises(DOMException); // Introduced in DOM Level 2: Element createElementNS(in DOMString namespaceURI, in DOMString qualifiedName) raises(DOMException); // Introduced in DOM Level 2: Attr createAttributeNS(in DOMString namespaceURI, in DOMString qualifiedName) raises(DOMException); // Introduced in DOM Level 2: NodeList getElementsByTagNameNS(in DOMString namespaceURI, in DOMString localName); // Introduced in DOM Level 2: Element getElementById(in DOMString elementId); }; REFFER PAGE: http://www.w3.org/TR/DOM-Level-2-Core/core.html |
|
|
5楼#
发布于:2005-07-20 11:39
|
|
|
6楼#
发布于:2005-07-20 11:39
gzpbx总结的挺好。
getElementsByName是DOM Level 2 HTML的内容, http://www.w3.org/TR/2003/REC-DOM-Level ... D-71555259 不在core部分。DOM标准本来就分core, HTML Events等几个部分。 |
|
7楼#
发布于:2005-07-20 11:39
斑竹这么说,我也去看了一下,的确是有这个接口,不过gzpbx的做法也欠妥。
按照id的定义,是不可以重复的,如果重复,肯定不能通过校验,而且会对getElementById造成影响。 而且我也作了一下测试,并不是IE对NAME属性都解释的,可以参见我的测试页面。 其中firefox的机制很简单,只要带name的节点都留下了,但是ie/op7就很古怪,如果说他们按照w3c来解释这个接口(即只列出form中的控件)那么就不应该把div给列出来,如果说像fx那样只要带name的节点都留下来,那么应该把em节点也包含进去,可是实际情况却没有,所以这个接口成了鸡肋。 总结一下,如果要写兼容性强而且又能通过验证的页面,那么getElementsByName目前肯定要避免多用,而且不能出现重复的id,但是如果id不能重复的话这个返回复数的意义就不存在了。 |
|
|
8楼#
发布于:2005-07-20 11:39
那怎么办哪?如果需要根据某个共同的属性返回一组标签可就没有办法了~
|
|
|
9楼#
发布于:2005-07-20 11:39
|
|
|
10楼#
发布于:2005-07-20 11:39
jhsea3do:这是W3C为DOM LV2定义的文档对象接口,我没有看到getElementsByName,呵呵,不知道为什么会有人把它扯到标准上面?interface Document : Node { readonly attribute DocumentType doctype; readonly attribute DOMImplementation implementation; readonly attribute Element documentElement; Element createElement(in DOMString tagName) raises(DOMException); DocumentFragment createDocumentFragment(); Text createTextNode(in DOMString data); Comment createComment(in DOMString data); CDATASection createCDATASection(in DOMString data) raises(DOMException); ProcessingInstruction createProcessingInstruction(in DOMString target, in DOMString data) raises(DOMException); Attr createAttribute(in DOMString name) raises(DOMException); EntityReference createEntityReference(in DOMString name) raises(DOMException); NodeList getElementsByTagName(in DOMString tagname); // Introduced in DOM Level 2: Node importNode(in Node importedNode, in boolean deep) raises(DOMException); // Introduced in DOM Level 2: Element createElementNS(in DOMString namespaceURI, in DOMString qualifiedName) raises(DOMException); // Introduced in DOM Level 2: Attr createAttributeNS(in DOMString namespaceURI, in DOMString qualifiedName) raises(DOMException); // Introduced in DOM Level 2: NodeList getElementsByTagNameNS(in DOMString namespaceURI, in DOMString localName); // Introduced in DOM Level 2: Element getElementById(in DOMString elementId); }; ??? getElementsByName 不是 w3c 标准 ??? |
|
|
11楼#
发布于:2005-07-20 11:39
jhsea3do: 不懂就不要乱说好了,name 是 legitimate attribute,可以在大部份 form elements 以外物件使用。 建议楼主自己到 w3c 及 google 找资料。 -------------------------------------------------------- 不关注 web standard,同情自以为懂得 web standard 的人 |
|
|
12楼#
发布于:2005-07-20 11:39
什么叫我不懂?
你有没有用过XHTML(s),去看看DTD定义吧,除了meta,a,object,param,map,input,select,textarea,button可以用name作attribute,其他标签都不能用name。 我说话从来都是经过实践后才说的,不像你纸上谈兵! |
|
|
13楼#
发布于:2005-07-20 11:39
|
|
|
14楼#
发布于:2005-07-20 11:39
jhsea3do说的基本上是对的,不能算乱说,至少对用法的理解是比较正确的。 name是legitimate attribute,但不是大部分object都可以使用, 可以察看这一页: http://www.w3.org/TR/html4/index/attributes.html 其中id的相关元素很宽泛,是All elements but BASE, HEAD, HTML, META, SCRIPT, STYLE, TITLE name则针对性很强,除了form element,只有applet, object, frame, iframe,a,map,param和meta这几个,算不上大部分。 |
|
上一页
下一页