我正在维护一个复杂的Web应用程序。
我有大量的div都有相同的ID 。
我知道这是完全错误的,事实上document.getElementById()
具有该ID只会为我生成一个匹配。
但是我能够使用jQuery(我们在1.6.2上)提取我正在寻找的元素,如下所示:$('#bad_id[nonstandard_attr_name=somethingSpecific]')
还没准备好说这是一个“解决方案”。
我担心这是否可靠。 jQuery是否真的会使用DOM walk搜索与ID匹配的所有元素?这可能是获得所有这些的唯一途径。
是否先按其他属性过滤元素,然后按ID过滤掉?这也会达到理想的行为,但最好知道它的顺序。
答案 0 :(得分:8)
如果您需要选择具有相同ID的多个元素,您只需使用属性选择器:
$( "[id='myid']" )
属性选择器不会查看任何语义(如唯一ID等)的属性键。
答案 1 :(得分:0)
我无法告诉你jQuery或其他dom遍历会做什么(可疑它会一直有效)但你可以试试这个:
document.filter = function(attr, val, r) {
r = r || document.getElementsByTagName("*");
var s = [];
for(var i = 0; i < r.length; i++) {
if(r[i].getAttribute(attr) == val) {
s.push(r[i]);
}
}
return s;
};
var s = document.filter("nonstandard_attr_name", "somethingSpecific", document.filter("id", "bad_id"));
console.log(s);
答案 2 :(得分:0)
使用会导致使用getElementById()
以外的其他内容的选择器会产生一致的结果,但请确保使用IE8进行测试,因为IE8不使用document.querySelectorAll()
。
使用诸如 .find .children和.filter之类的方法也应该产生一致的结果,无论id是唯一的。
答案 3 :(得分:0)
好吧,正如评论中所见,我的猜测是为什么它会继续搜索任何元素。是
getElementById
返回第一个元素,然后停止搜索,但同样看起来不适合jQuery。它确实返回具有“坏”id的所有元素。
可以在 Fiddle 中看到,
所以它选择了所有的元素,这意味着jQuery不会停留在第一个元素,而是继续搜索整个元素,因此IMO,你可以使用jQuery来选择具有公共id的多个元素。应该没有任何问题。