JavaScript和getElementById用于具有相同ID的多个元素

Raj*_*n P 46 javascript

如何通过指定元素来获取元素集合id?我想获得idhtml中具有相同标签的所有标签的名称.

我想只使用getElementById()一个元素数组.我怎样才能做到这一点?

Ode*_*ded 77

HTML规范所要求的ID属性是在一个页面独特之处:

此属性为元素指定名称.该名称在文档中必须是唯一的.

如果您有多个具有相同ID的元素,则HTML无效.

所以,getElementById()应该只返回一个元素.你不能让它返回多个元素.

有几个相关的函数将返回一个元素数组 - getElementsByName或者getElementsByClassName可能更适合您的要求,虽然getElementsByClassName它是HTML 5的新功能,它仍处于草稿状态.

  • 告诉别人他们反对元是很酷的,但是,你可以得到像wordpress这样的无用框架,这些框架将填充具有相同名称的多个ID的页面.所以下次,只要给出答案,然后告诉为什么这个答案很糟糕.在一天结束的原因,如果问题没有得到一个有效的解决方案,答案表明他们反对meta是不好的. (13认同)
  • 从我这里下来,`class`在语义上比`name`好,这里没有正确使用.我相信`name`仅适用于`form`元素.此外,`name`的真正目的是在将查询属性名称发送到服务器时将其命名.应该在多个元素上使用它们的唯一时间是对单选按钮进行分组. (8认同)
  • 我也被贬低了; 我删除了我的答案,因为它实际上是你的答案.我怀疑,除了一个自我重要的意见之外,这个贬低者没有合理的理由来解决他的问题. (4认同)
  • @Delan Azabani - 在问题的上下文中,不清楚`getElementsByName`或`getElementsByClassName`是否是合适的解决方案.我已经在两者上添加了一些细节. (2认同)

Bra*_*ord 30

我知道这是一个老问题,并且具有多个ID的HTML页面无效.但是,我在需要抓取并重新格式化包含重复ID(无效HTML)的其他API的HTML文档时遇到了这个问题.

所以对于其他任何人来说,这里是我用来解决使用querySelectorAll问题的代码:

var elms = document.querySelectorAll("[id='duplicateID']");

for(var i = 0; i < elms.length; i++) 
  elms[i].style.display='none'; // <-- whatever you need to do here.
Run Code Online (Sandbox Code Playgroud)

  • `document.querySelectorAll("#duplicateID")` 似乎也有效。 (3认同)
  • 这救了我!:) (2认同)

Pau*_*her 26

为什么你想要这样做是超出我的,因为id应该在文档中是唯一的.但是,浏览器往往对此非常松懈,所以如果你真的必须使用getElementById来实现这个目的,你可以这样做:

function whywouldyoudothis() {
    var n = document.getElementById("non-unique-id");
    var a = [];
    var i;
    while(n) {
        a.push(n);
        n.id = "a-different-id";
        n = document.getElementById("non-unique-id");
    }

    for(i = 0;i < a.length; ++i) {
        a[i].id = "non-unique-id";      
    }
    return a;
}
Run Code Online (Sandbox Code Playgroud)

但是,这很愚蠢,我不相信这会永远适用于所有浏览器.尽管HTML DOM规范将id定义为readwrite,但如果遇到具有相同id的多个元素,则验证浏览器会抱怨.

编辑:给定一个有效的文件,可以达到同样的效果:

function getElementsById(id) {
  return [document.getElementById(id)];
}
Run Code Online (Sandbox Code Playgroud)

  • 解决方案的+1 - 尽管它违反了规范,但这是一个不完美的世界,我需要为我继承的项目做这件事. (4认同)

cpr*_*ack 9

document.querySelectorAll("#yourId"); 返回其id为的所有元素 yourId


Del*_*ani 7

具有相同的多个元素是非法的id.将id被用作一个单独的标识符.对于元素组,请使用class,而getElementsByClassName不是.

  • 大多数元素不支持name属性,因此这不是一个非常实用的建议.一类是一组有共同点的东西.如果有人想用JS抓住一堆东西,那么他们必须有一些共同点.因此,班级是**的优秀**选择.它不是**一个专门用于挂起CSS的属性.唯一的问题是对getElementsByClassName的浏览器支持有限,但是有跨浏览器实现(包括独立的,在YUI和jQuery中) (6认同)
  • @Noon Silk - 大卫并没有要求辩论,只是一个解释.拒绝与某人讨论某事并不是说服他们同意你的观点的好方法.(嗯,这是我的意见,无论如何) (4认同)
  • belugabob:不是那么多.关于"name"是否是大多数元素的有效属性,这不是一个意见问题:它根本就不是,所以Noon Silk似乎在拒绝. (3认同)
  • 这不是StackOverflow的全部意义 - 汇集一大堆意见和想法,供其他人学习吗? (3认同)
  • @Noon Silk:类元素是为识别目的而设计的.所以它*不应该*不用于识别.HTML4规范说:`class属性在HTML中有几个角色:1 - 作为样式表选择器.2 - 由用户代理进行通用处理.使用`class`进行识别是一种非常有效的方法 - 这就是它的目的! (2认同)

rem*_*rel 3

id 应该是唯一的,使用属性“name”和“getelementsbyname”代替,您将拥有数组。

  • 如果元素支持名称属性,而大多数元素不支持。除了表单控件之外,人们一直在大力推动摆脱它。 (2认同)
  • 您不需要 JS 框架来使用 gEBCN,您可以测试该函数是否存在,然后回退到循环元素并检查其类的函数 - 网上有大量实现。 (2认同)