HTML DOM中存在ID重复的元素时javascript getElementById()的行为?

HTML DOM中存在ID重复的元素时javascript getElementById()的行为?,javascript,Javascript,当HTML DOM中存在具有重复ID的元素时,是否有人可以解释javascript getElementById()的行为???虽然没有定义标准行为,但通常会返回找到的第一个元素 演示:是。它将返回到第一个。我们不能使用与HTML属性相同的ID 1. * 是否查看从纯拷贝到剪贴板打印 * { margin: 0; padding: 0; } #container * { border: 1px solid black; } #container

当HTML DOM中存在具有重复ID的元素时,是否有人可以解释javascript getElementById()的行为???

虽然没有定义标准行为,但通常会返回找到的第一个元素


演示:

是。它将返回到第一个。我们不能使用与HTML属性相同的ID
1. * 是否查看从纯拷贝到剪贴板打印

* {  
 margin: 0;  
 padding: 0;  
}     
#container * {  
 border: 1px solid black;  
}     
#container {  
   width: 960px;  
   margin: auto;  
}     
对于初学者来说,在我们进入更高级的选择器之前,让我们先把那些显而易见的选项去掉

星号将指向页面上的每个元素。许多开发人员将使用此技巧将边距和填充归零。虽然这对于快速测试来说当然很好,但我建议您不要在生产代码中使用它。它在浏览器上增加了太多的重量,这是不必要的

*也可与子选择器一起使用。 是否查看从纯拷贝到剪贴板打印

* {  
 margin: 0;  
 padding: 0;  
}     
#container * {  
 border: 1px solid black;  
}     
#container {  
   width: 960px;  
   margin: auto;  
}     
这将针对作为#container div的子元素的每一个元素。同样,如果可能的话,尽量不要使用这种技术

X 是否查看从纯拷贝到剪贴板打印

* {  
 margin: 0;  
 padding: 0;  
}     
#container * {  
 border: 1px solid black;  
}     
#container {  
   width: 960px;  
   margin: auto;  
}     

将哈希符号作为选择器的前缀可以让我们按id设置目标。这是最常见的用法,但是在使用id选择器时要小心。

具有相同id的多个对象是非法的。因为不允许这样做,
getElementById()的行为
规范中未指定存在多个匹配项。事实上,明确表示:“如果有多个元素具有此ID,则不会定义行为。”

在我尝试过的几个浏览器中,它返回第一个,但显然你不应该依赖它

如果要查找所有匹配项,必须设计一个查询,查看所有标记的ID并收集与您的标记匹配的ID

在纯javascript中,您可以这样做:

function getAllElementsById(id) {
    var all = document.getElementsByTagName("*");
    var results = [], elem;
    for (var i = 0; i < all.length; i++) {
        elem = all[i];
        if (elem.id && elem.id === id) {
            results.push(elem);
        }
    }
    return(results);
}
函数getAllegementsById(id){ var all=document.getElementsByTagName(“*”); var结果=[],元素; 对于(变量i=0;i如果有多个元素具有相同的id,则可以使用

document.querySelectorAll("[id='myid']")

但是,如果您可以控制它,您应该只修复HTML。

是的,行为是未定义的

标记无效,并且没有标准定义浏览器在这种情况下应该做什么


每个浏览器都会尝试做一些合理的事情,通常会返回第一个元素。其他可能的处理方法是返回最后一个元素,不返回任何元素(null),或抛出错误。

谢谢Ayman,有没有办法列出所有具有指定id的元素?出于好奇,规范中是否定义了这种行为?或者它是未指明的,但大多数(如果不是全部)浏览器都是这样的?有人(看不到谁,发布了这个链接,然后删除了这个帖子:)。不管是谁,谢谢……就像@RabNawaz说的,ID必须是唯一的。您可以有多个元素具有相同的
名称
属性。关键是您不能依赖行为,即使当前的所有实现都以相同的方式进行。浏览器供应商总是试图制作更好的浏览器,因此任何新的浏览器都不太可能尝试以不同的方式来实现它。请在JSFIDLE中尝试。如果有人真的发布了各种浏览器如何处理这个问题的测试结果,我还没有找到。假设,如果~所有浏览器都一致地处理它,那么这将不是我们第一次有一个新标准的坚实基础,或者至少是一个我们都可以使用的事实上的标准。ID“必须”是唯一的,但不保证、不强制执行,甚至在发生时抛出任何警告或错误,这一直困扰着我。除非后者突然出现,否则我建议我们可以放弃前者。