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

IT技术 javascript
2021-01-26 14:41:22

如何通过指定元素的id属性来获取元素的集合我想获取id在 html 中具有相同标签的所有标签的名称

我想使用 ONLYgetElementById()来获取元素数组。我怎样才能做到这一点?

6个回答

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

[T] id 属性值在元素树中的所有 ID 中必须是唯一的

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

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

有几个相关的函数将返回元素列表:getElementsByName或者getElementsByClassName可能更适合您的要求。

告诉人们他们反对元是很酷的,但是,您可以获得像 wordpress 这样的无用框架,这些框架将填充具有多个同名 ID 的页面。所以下次,只要给出答案,然后说出为什么这个答案很糟糕。因为归根结底,如果问题没有得到有效的解决方案,那么说明他们反对元的答案是不好的。
2021-03-16 14:41:22
@Delan Azabani -在这个问题的背景下,如果任何不清楚getElementsByName或者getElementsByClassName是合适的解决方案。我在两者上都添加了一些细节。
2021-03-23 14:41:22
@Oded 我正在尝试 getElementsByName("tags").style.opacity='1'; 但我不能这样做..请帮忙
2021-03-23 14:41:22
如果将 Primefaces 附加到 body,有时会为对话框生成重复的元素 ID。也许它是小部件中的数据表和 ajax 过程的某种组合,它们在 rowselect 上打开对话框。看过好几次了。文档显示正常,最后一个对话框可见,所有其他具有相同 ID 的对话框都被隐藏。
2021-04-03 14:41:22
我的 Downvote 在class语义上也比 好name,这里没有正确使用。我相信name这只适用于form元素。此外,真正的目的name是在发送到服务器时命名查询属性名称。它们应该用于多个元素的唯一时间是对单选按钮进行分组。
2021-04-07 14:41:22

我知道这是一个老问题,并且具有多个 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.
document.querySelectorAll("#duplicateID") 似乎也在工作。
2021-03-25 14:41:22
使用 Jquery,$('[id^=duplicateID]').hide();可以取代一切
2021-03-28 14:41:22
这也救了我,谢谢!恕我直言,这个问题非常有效:我有一个按钮被移动到 DOM 树中的其他地方的情况,然后树的部分更新重新加载了一个具有相同 id 的新按钮。发生这种情况时,我必须取下旧按钮并用新按钮替换。
2021-04-10 14:41:22

为什么要这样做超出了我的理解,因为 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;
}

然而,这很愚蠢,我不相信它会永远在所有浏览器上工作。尽管 HTML DOM 规范将 id 定义为 readwrite,但如果遇到多个具有相同 id 的元素,验证浏览器会抱怨。

编辑:给定一个有效的文件,同样的效果可以这样实现:

function getElementsById(id) {
  return [document.getElementById(id)];
}
-1 因为 Brad Bamford 的解决方案看起来更现代且不那么老套,并且不需要清理所有更改的 id 值(如果需要)。
2021-03-22 14:41:22
确实是一个愚蠢的解决方法。但是为什么要document.getElementById在添加的部分中定义一个包装函数呢?那完全没用(除了使用较短的别名$来实现相同的目的)。
2021-03-26 14:41:22
+1 解决方案 - 尽管它违反规范,但这是一个不完美的世界,我需要为我继承的项目执行此操作。
2021-03-29 14:41:22
OP 的具体要求是获取元素数组。 document.getElementById只返回一个元素(不在数组中),我的函数getElementsById返回一个数组,其中包含有效文档中具有给定 id 的所有元素。
2021-03-30 14:41:22
正是我需要的。我正在调用一个使用包含数字字段的中继器的 ASPX 页面。然后我调用一个 javascript 函数,该函数仅使用 HTML 和 CSS 将该数字字段转换为代码 39 条码,以避免使用图形图像。由于这些字段的总数是动态生成的并且可以从 1 到 1000 不等,因此我不得不使用数组。或者更确切地说,当 IE、Chrome、Safari 和 Opera 但不是 FireFox 中存在多个具有相同 ID 的元素时,调用 GetElementByID 会自动返回一个数组。当然,我的客户坚持使用 firefox 兼容
2021-04-05 14:41:22

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

多个元素具有相同的id. id被用作一个单独的标识符。对于元素组,请使用class, 和getElementsByClassName代替。

这不是 StackOverflow 的全部意义所在——汇集大量的意见和想法,供其他人学习吗?
2021-03-16 14:41:22
@Noon Silk - 大卫不是要争论,只是要一个解释。拒绝与某人讨论某事并不是说服他们同意您的意见的好方法。(好吧,无论如何,这就是我的观点)
2021-03-19 14:41:22
大多数元素不支持 name 属性,因此这不是一个非常实用的建议。类是一组具有共同点的事物。如果有人想用JS抓取一堆东西,那么他们必须有一些共同点。因此 class 是一个很好的选择。不是专门用于挂起 CSS 的属性。唯一的问题是浏览器对 getElementsByClassName 的支持有限,但是有跨浏览器的实现(包括独立的和在 YUI 和 jQuery 中的)
2021-04-05 14:41:22
@Noon Silk:类元素是为识别目的而设计的。所以它应该用于识别。HTML4 规范说:The class attribute has several roles in HTML: 1-As a style sheet selector. 2-For general purpose processing by user agents.. 使用class识别是一个完全有效的方法-这就是它的目的是为!
2021-04-05 14:41:22
belugabob:没有那么多。name对于大多数元素是否为有效属性并不是一个意见问题:它根本不是,所以 Noon Silk 似乎是否认的。
2021-04-06 14:41:22