当 HTML DOM 中存在具有重复 ID 的元素时,有人可以阐明 javascript getElementById() 的行为吗?
5 回答
虽然没有定义标准行为,但通常它会返回找到的第一个元素。
演示:http: //jsfiddle.net/ruNKK/
如果您有多个具有相同 id 的元素,则可以使用
document.querySelectorAll("[id='myid']")
但是,如果您可以控制它,您应该只修复 HTML。
是的,行为未定义。
标记无效,并且没有标准定义浏览器在这种情况下应该做什么。
每个浏览器都会尝试做一些合理的事情,通常返回第一个元素。其他可能的处理方式是返回最后一个元素,根本没有元素(null),或者抛出错误。
拥有多个具有相同 ID 的对象是非法的。因为它不应该被允许,getElementById()
所以规范中没有指定存在多个匹配项的行为。事实上,规范明确指出:“如果多个元素具有此 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);
}
是的。它会回到第一个。我们不能使用相同的ID作为HTML属性
1. *查看plaincopy到clipboardprint?
* {
margin: 0;
padding: 0;
}
在我们进入更高级的选择器之前,让我们先为初学者敲掉明显的选择器。
星号将针对页面上的每个元素。许多开发人员将使用此技巧将边距和填充归零。虽然这对于快速测试当然很好,但我建议您永远不要在生产代码中使用它。它给浏览器增加了太多的重量,而且是不必要的。
* 也可以与子选择器一起使用。查看plaincopy到剪贴板打印?
#container * {
border: 1px solid black;
}
这将针对作为#container div 的子元素的每个元素。同样,尽量不要使用这种技术,如果有的话。
X
查看plaincopy到剪贴板打印?
#container {
width: 960px;
margin: auto;
}
为选择器添加哈希符号前缀允许我们按 id 定位。这很容易成为最常见的用法,但是在使用 id 选择器时要小心。