【问题标题】:JavaScript and getElementById for multiple elements with the same ID具有相同 ID 的多个元素的 JavaScript 和 getElementById
【发布时间】:2011-04-06 03:46:32
【问题描述】:

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

我只想使用getElementById() 来获取元素数组。我该怎么做?

【问题讨论】:

  • html元素如何共享同一个id???改用类。
  • 对于一个合法的用例,我可能正在使用 JS 在不是我自己开发的网站上的控制台中运行一些代码。

标签: javascript


【解决方案1】:

HTML spec 要求 id 属性在页面中是唯一的:

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

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

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

有几个相关函数将返回元素列表:getElementsByNamegetElementsByClassName,它们可能更适合您的要求。

【讨论】:

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

我知道这是一个老问题,具有多个 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.

【讨论】:

  • 这也救了我,谢谢!恕我直言,这个问题非常有效:我有这种情况,其中一个按钮被移动到 DOM 树的其他地方,然后树的部分更新重新加载一个具有相同 ID 的新按钮。发生这种情况时,我必须删除旧按钮并用新按钮替换它。
  • document.querySelectorAll("#duplicateID") 似乎也可以正常工作。
  • 使用 Jquery,$('[id^=duplicateID]').hide(); 可以取代一切
【解决方案3】:

您为什么要这样做超出了我的范围,因为 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 定义为可读写,但验证浏览器在遇到多个具有相同 id 的元素时会报错。

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

function getElementsById(id) {
  return [document.getElementById(id)];
}

【讨论】:

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

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

【讨论】:

    【解决方案5】:

    多个元素具有相同的id 是非法的。 id 用作个人标识符。对于元素组,请改用classgetElementsByClassName

    【讨论】:

    • 大多数元素不支持 name 属性,因此这不是一个非常实用的建议。类是一组具有共同点的事物。如果有人想用 JS 抢一堆东西,那么他们必须有一些共同点。因此类是一个优秀的选择。它不是是一个专门用来挂起 CSS 的属性。唯一的问题是对 getElementsByClassName 的浏览器支持有限,但是有跨浏览器的实现(包括独立的以及在 YUI 和 jQuery 中)
    • @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 进行识别是一种完全有效的方法——这就是它的目的!
    • @Noon Silk - 大卫不是要争论,只是解释。拒绝与某人讨论某事并不是说服他们同意你的意见的好方法。 (好吧,无论如何,这是我的看法)
    • belugabob:没那么多。对于大多数元素来说,name 是否是一个有效属性并不是一个意见问题:它根本不是,所以 Noon Silk 似乎是在否认。
    • 这难道不是 StackOverflow 的重点——汇集大量意见和想法,供其他人学习吗?
    【解决方案6】:

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

    【讨论】:

    • 如果元素支持 name 属性,大多数不支持。除了表单控件外,一直在大力推动摆脱它。
    • 确实,但如果他不使用 js 框架,这是唯一的解决方案(afaik),即使(根据 w3c)元素不支持此属性,它也适用于每个元素.
    • 你不需要一个 JS 框架来使用 gEBCN,你可以测试函数的存在,然后回退到一个循环遍历元素并检查它们的类的函数 - 大量的实现在网。
    【解决方案7】:

    正如其他人所说,您不应在 HTML 中多次使用相同的 ID,但是...具有 ID 的元素附加到 document 对象和 window 在 Internet Explorer 上。参考:

    Do DOM tree elements with ids become global variables?

    如果您的 HTML 中存在多个具有相同 ID 的元素,则此属性将作为数组附加。抱歉,如果这是标准行为,或者至少您在浏览器之间得到相同的行为,我不知道去哪里看,我对此表示怀疑。

    【讨论】:

      【解决方案8】:

      类对于引用任何你想要的东西来说已经绰绰有余了,因为它可以用 more 词之一命名:

      <input class="special use">
      <input class="normal use">
      <input class="no use">
      <input class="special treatment">
      <input class="normal treatment">
      <input class="no special treatment">
      <input class="use treatment">
      

      这就是你可以使用 css 应用不同样式的方式(Bootstrap 就是最好的例子),当然你可以调用

      document.getElementsByClassName("special");
      document.getElementsByClassName("use");
      document.getElementsByClassName("treatment");
      document.getElementsByClassName("no");
      document.getElementsByClassName("normal");
      

      你需要的任何分组等等。

      现在,在最后一种情况下,您确实想按 id 对元素进行分组。您可以使用数字相似但不相等的 id 来使用和引用元素:

      <input id=1>
      <input id="+1">
      <input id="-1">
      <input id="1 ">
      <input id=" 1">
      <input id="0x1">
      <input id="1.">
      <input id="1.0">
      <input id="01.0">
      <input id="001">
      

      这样,您可以在知道数字 id 的情况下,通过添加额外的非无效数字字符并调用函数从其合法字符串标识值中获取(通过解析等)原始索引来访问和获取元素。它适用于以下情况:

      • 有几行包含相似的元素并想要处理其事件 连贯地。无论您是删除一个还是几乎全部。 由于数字引用仍然存在,因此您可以重用它们并 重新分配其已删除的格式。

      • 类、名称和标记名标识符用完。

      尽管您可以使用空格和其他常见符号,即使它不是在浏览器中严格验证的要求,但不建议使用它们,特别是如果您打算以其他格式(如 JSON)发送该数据。您甚至可以使用 PHP 来处理此类事情,但这是一种倾向于肮脏编程实践的坏习惯。

      【讨论】:

      • 对ID有要求。其中之一声明 Id 不得包含空格。更多信息可以在这里找到:stackoverflow.com/questions/70579/…
      • 但是,在我尝试过的浏览器(Opera、Firefox 和 Chrome)中并没有真正验证要求。
      【解决方案9】:

      您不应该这样做,即使它可能不可靠并且容易引起问题。

      原因是 ID 在页面上是唯一的。即你不能在页面上拥有超过 1 个具有相同 ID 的元素。

      【讨论】:

      • 好吧,你可以拥有多个具有相同 ID 的元素,但你不应该这样做 - 由于浏览器之间的差异,这样做的后果是不可预测的。这是很多问题的根源——如果所有浏览器都拒绝具有重复 ID 属性的页面,那么整个讨论或多或少就没有必要了。 (在理想世界中……)
      【解决方案10】:

      这是我的解决方案:

      <script type="text/javascript">
          $(document).ready(function () {
             document.getElementsByName("mail")[0].value = "ex_mail1";
             document.getElementsByName("mail")[1].value = "ex_mail2";
          });
      </script>
      

      或者你可以使用for循环。

      【讨论】:

      • 这没有回答问题,即“如何通过指定元素的id 属性来获取元素集合?”
      【解决方案11】:

      你可以使用 document.document.querySelectorAll("#divId")

      【讨论】:

        【解决方案12】:

        我们可以使用 document.forms[0].Controlid

        【讨论】:

        • 解释一下会有所帮助。
        • 这没有回答问题。如果document.forms[0].Controlid 存在,那么它仍然只是一个元素。这如何帮助获取具有相同 ID 的多个元素?
        【解决方案13】:

        如果您使用 d3 处理具有相同类/id 的多个对象

        您可以使用 d3.selectAll(".classname"); 删除类元素的子集

        例如,http://medcorp.co.nz 上的圆环图利用了类名为“arc”的弧对象的副本,并且只有一行 d3, d3.selectAll(".arc").remove();删除所有这些对象;

        使用 document.getElementById("arc").remove();只删除一个元素,并且必须多次调用(就像上面的建议一样,他创建了一个循环来删除对象 n 次)

        【讨论】:

          猜你喜欢
          • 2017-06-09
          • 1970-01-01
          • 1970-01-01
          • 2011-02-27
          • 1970-01-01
          • 2017-06-13
          • 2016-12-06
          相关资源
          最近更新 更多