Chỉ nên có một phần tử có id đã cho. Nếu bạn bị mắc kẹt với tình huống đó, hãy xem phần thứ hai của câu trả lời của tôi cho các tùy chọn.
Cách trình duyệt hoạt động khi bạn có nhiều phần tử có cùng id (HTML bất hợp pháp) không được xác định theo đặc điểm kỹ thuật. Bạn có thể kiểm tra tất cả các trình duyệt và tìm hiểu cách chúng hoạt động, nhưng không khôn ngoan khi sử dụng cấu hình này hoặc dựa vào bất kỳ hành vi cụ thể nào.
Sử dụng các lớp nếu bạn muốn nhiều đối tượng có cùng số nhận dạng.
<div>
<span class="a">1</span>
<span class="a">2</span>
<span>3</span>
</div>
$(function() {
var w = $("div");
console.log($(".a").length); // 2
console.log($("body .a").length); // 2
console.log($(".a", w).length); // 2
});
Nếu bạn muốn chắc chắn nhìn vào các yếu tố với ID đó đều giống nhau vì bạn không thể sửa chữa các tài liệu, sau đó bạn sẽ phải làm lặp riêng của bạn khi bạn không thể dựa vào bất cứ việc xây dựng trong DOM chức năng.
Bạn có thể làm như vậy như thế này:
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);
}
Hoặc, sử dụng jQuery:
$("div *").filter(function() {return(this.id == "a");});
jQuery dụ làm việc: http://jsfiddle.net/jfriend00/XY2tX/.
Tại sao bạn nhận được các kết quả khác nhau, điều đó sẽ liên quan đến việc triển khai nội bộ bất kỳ đoạn mã nào đang thực hiện thao tác chọn thực tế. Trong jQuery, bạn có thể nghiên cứu mã để tìm hiểu xem bất kỳ phiên bản nào đã làm, nhưng vì đây là HTML bất hợp pháp, không có gì đảm bảo rằng nó sẽ giữ nguyên theo thời gian. Từ những gì tôi đã nhìn thấy trong jQuery, trước tiên nó kiểm tra xem bộ chọn là một id đơn giản như #a
và nếu có, chỉ cần sử dụng document.getElementById("a")
. Nếu bộ chọn phức tạp hơn và querySelectorAll()
tồn tại, jQuery thường sẽ chuyển bộ chọn ra thành chức năng trình duyệt được tích hợp sẵn sẽ có một cài đặt cụ thể cho trình duyệt đó. Nếu querySelectorAll()
không tồn tại, thì nó sẽ sử dụng công cụ chọn Sizzle để tìm thủ công bộ chọn sẽ có cài đặt riêng. Vì vậy, bạn có thể có ít nhất ba triển khai khác nhau trong cùng một gia đình trình duyệt tùy thuộc vào bộ chọn chính xác và trình duyệt mới như thế nào. Sau đó, tất cả các trình duyệt riêng lẻ sẽ có các triển khai querySelectorAll()
riêng của chúng. Nếu bạn muốn xử lý một cách đáng tin cậy với tình huống này, có thể bạn sẽ phải sử dụng mã lặp của riêng mình như tôi đã minh họa ở trên.
thể bạn vui lòng giải thích ** Lưu ý **? Khi thêm công cụ chọn thẻ là hữu ích? –
@Misha Moroshko - Bất cứ khi nào có thể, bạn nên bao gồm bộ chọn thẻ. Lý do cho điều này là do bộ chọn thẻ là * nhiều * hiệu quả hơn bộ chọn thuộc tính. Nếu bạn đủ điều kiện bộ chọn thuộc tính của bạn với bộ chọn thẻ, trước tiên jQuery sẽ sử dụng công cụ chọn thẻ để tìm các phần tử có thẻ đó và sau đó chỉ chạy bộ chọn thuộc tính trên các phần tử đó. Điều này đơn giản hơn nhiều. –
Tôi thấy ở đây 'div # some_id' chậm hơn' # some_id': http://stackoverflow.com/q/7262116/247243 –