只能有一个具有给定ID的元素。如果您仍然遇到这种情况,请参阅我的答案的第二部分以获得选择。
规范未定义当您具有多个具有相同ID(非法HTML)的元素时浏览器的行为方式。您可以测试所有浏览器并找出它们的行为,但是使用此配置或依赖任何特定行为是不明智的。
如果您希望多个对象具有相同的标识符,请使用类。
<div>
<span class="a">1</span>
<span class="a">2</span>
<span>3</span>
</div>
$(function() {
var w = $("div");
console.log($(".a").length);
console.log($("body .a").length);
console.log($(".a", w).length);
});
如果由于无法修复文档而要可靠地查看具有相同ID的元素,那么您将必须进行自己的迭代,因为您不能依赖任何内置的DOM函数。
您可以这样做:
function findMultiID(id) {
var results = [];
var children = $("div").get(0).children;
for (var i = 0; i < children.length; i++) {
if (children[i].id == id) {
results.push(children[i]);
}
}
return(results);
}
或者,使用jQuery:
$("div *").filter(function() {return(this.id == "a");});
jQuery工作示例:http : //jsfiddle.net/jfriend00/XY2tX/。
至于为什么得到不同的结果,这与执行实际选择器操作的任何代码的内部实现有关。在jQuery中,您可以研究代码以找出给定版本在做什么,但是由于这是非法的HTML,因此无法保证它会随着时间的推移保持不变。根据我在jQuery中看到的内容,它首先检查选择器是否是一个简单的id #a
,如果是,则使用它document.getElementById("a")
。如果选择器比它更复杂并且querySelectorAll()
存在,jQuery将经常将选择器传递给内置的浏览器功能,该功能具有特定于该浏览器的实现。如果querySelectorAll()
不存在,则它将使用Sizzle选择器引擎手动找到具有自己实现的选择器。因此,您可以在同一浏览器系列中至少拥有三种不同的实现方式,具体取决于确切的选择器和浏览器的新颖程度。然后,各个浏览器将具有各自的querySelectorAll()
实现。如果您想可靠地处理这种情况,则可能必须使用您自己的迭代代码,如上文所述。