2011-11-22 26 views
8

Tôi luôn nghĩ rằng jQuery chỉ hoạt động trên các phần tử DOM , đó là các nút có nodeType == 1.jQuery xử lý các phần tử nhận xét như thế nào?

Tuy nhiên Tôi bị sốc rằng trong khi tạo ra HTML $("<p> </p><!-- comment -->") kết quả trong:

[p, Comment { data=" comment ", length=21, nodeName="#comment", more...}] (định dạng Firebug)

tôi chấp nhận một số HTML bằng AJAX và một DOM Comment đã được tạo ra theo cách này và thông qua nơi nào đó để một chức năng chỉ áp dụng cho các phần tử: defaultView.getComputedStyle(elem, null)

Có cách nào sạch không?

Trả lời

5

Tôi luôn luôn nghĩ rằng jQuery hoạt động chỉ trên DOM yếu tố

selectors của nó chỉ chọn phần tử DOM. Trong trường hợp của bạn, bạn đang tạo các nút từ chuỗi HTML bạn đã cung cấp. Vì vậy, jQuery phân tích cú pháp chuỗi và cung cấp cho bạn các nút bạn đang yêu cầu.

Để vệ sinh, hãy thực hiện .filter().

var els = $("<p> </p><!-- comment -->").filter(function() { 
                return this.nodeType === 1; 
               }); 
+0

Được chấp nhận vì giải thích. – tillda

+0

@tillda: Chỉ cần FYI, nó cũng là một hoạt động nhanh hơn với kiểm tra 'this.nodeType === 1' trực tiếp hơn chạy bộ chọn' "*" ', mặc dù với một bộ nhỏ, nó sẽ không tạo ra sự khác biệt đáng chú ý . – RightSaidFred

5

Hmm, một vấn đề thú vị. Sau khi dò tìm một chút, tôi phát hiện ra rằng bạn có thể xóa chúng bằng cách sử dụng .filter với universal selector (*).

var a = $("<p></p><!-- comment -->"); 
console.log(a); 
console.log(a.filter("*")); 
Các vấn đề liên quan