2012-07-11 15 views
5

Nói rằng tôi có một cấu trúc HTML nhưKhi sử dụng querySelectorAll, có cách nào để tham chiếu đến các nút con ngay lập tức của nút ngữ cảnh mà không sử dụng các ID không?

<div id="a"> 
    <div id="b"> 
    <div id="c"></div> 
    </div> 
</div> 

Để làm một truy vấn cho con cái "a" bằng querySelectorAll tôi có thể làm một cái gì đó giống như

//Get "b", but not "c" 
document.querySelectorAll('#a > div') 

Câu hỏi của tôi là: là nó có thể để làm điều này mà không có ID, tham chiếu nút trực tiếp? Tôi đã thử làm

var a_div = document.getElementById('a') 
a_div.querySelectorAll('> div') //<-- error here 

nhưng tôi gặp lỗi khi cho biết bộ chọn tôi đã sử dụng không hợp lệ.


Và trong trường hợp bất kỳ ai thắc mắc, trường hợp sử dụng thực của tôi sẽ phức tạp hơn như '> .foo .bar .baz' vì vậy tôi muốn tránh quá trình duyệt DOM thủ công. Hiện tại tôi đang thêm id tạm thời vào div gốc nhưng điều đó có vẻ giống như một hack xấu xí ...

+1

Xem thêm: http://stackoverflow.com/questions/3680876/use-queryselectorall-to-retrieve-direct-children – natevw

Trả lời

4

Không, không có cách nào (chưa) để tham chiếu tất cả các phần tử con của một số phần tử mà không sử dụng tham chiếu đến yếu tố đó. Vì > là một số child combinator, đại diện cho mối quan hệ giữa yếu tố gốc và phần tử con, cần simple selector (cha/mẹ) (ví dụ: thiếu trong ví dụ của bạn).

Trong một bình luận, BoltClock said rằng Selectors API Level 2 specification định nghĩa một phương pháp findAlltên thể thay đổi"mà chấp nhận như một cuộc tranh cãi những gì có thể sẽ được biết đến như một selector tương đối (một selector có thể bắt đầu với một combinator hơn bộ chọn hợp chất) ".
Khi điều này được thực hiện, nó có thể được sử dụng như sau:

a_div.findAll('> div'); 
+0

Cách giải quyết thông thường cho việc này là gì? Thêm một id (tạm thời) vào phần tử gốc là cách duy nhất? – hugomg

+0

@missingno Có. Phương thức khác là lặp qua tất cả '.childNodes' và kiểm tra xem liệu con có phải là div hay không bằng cách sử dụng' childNodes [i] .nodeName.toUpperCase() == 'div''. –

+3

Về mặt kỹ thuật, "Bởi vì'> 'là một * tổ hợp *", bạn không thể làm điều này với 'querySelectorAll()'. Trong tương lai gần, bạn sẽ có thể làm điều này với 'findAll()', chấp nhận như một đối số có lẽ sẽ được gọi là một bộ chọn tương đối (một bộ chọn có thể bắt đầu với bộ kết hợp chứ không phải bộ chọn ghép). Xem thông số kỹ thuật [Selectors API level 2] (http://www.w3.org/TR/selectors-api2). – BoltClock

-2

Tôi nghĩ mình phải được hiểu lầm câu hỏi của bạn, nhưng đây là cách tôi giải thích nó ..

var a = document.getElementById('a') 
var results = a.querySelectorAll('div'); 

kết quả sẽ giữ tất cả các div con của bạn ngay bây giờ.

+3

'kết quả' sẽ không chỉ giữ div con, nhưng ** tất cả ** divs hậu duệ. –

+1

Tôi muốn loại trừ div "c" khỏi kết quả. Bộ chọn '#a> div' chỉ trả về div "b". – hugomg

8
document.querySelector('#a').querySelectorAll(':scope > div') 

Tôi không chắc chắn về hỗ trợ trình duyệt, nhưng tôi sử dụng nó trên các ứng dụng đóng gói chrome và chrome dành cho thiết bị di động và nó hoạt động tốt.

+4

[MDN trên ': scope' trong' querySelector'] (https://developer.mozilla.org/en-US/docs/Web/CSS/:scope#Browser_compatibility): Chrome, Firefox 32+, Safari 7, không Opera, không phải IE. –