2013-04-22 14 views
9

Tôi có một tài liệu với một lời nhận xét gỡ lỗi trong nó trông như thế này:Có một API DOM để truy vấn các nút nhận xét không?

<!--SERVER_TRACE {...}--> 

Có cách nào để truy vấn DOM để truy cập vào nút này? Tôi đang tìm kiếm một giải pháp vani JavaScript, mà không cần sự trợ giúp của bất kỳ thư viện nào.

Suy nghĩ đầu tiên của tôi là tìm kiếm chiều sâu đầu tiên DOM và so sánh các nút được tìm thấy dựa vào giá trị loại nút cho các nhận xét, Node.COMMENT_NODE. Có cách nào dễ hơn không?

+1

bản sao có thể có của [Chọn nhận xét HTML với jQuery] (http://stackoverflow.com/questions/1623734/selecting-html-comments-with-jquery) –

+0

Chà, tôi đã chắc chắn ** Tôi biết nhận xét đó các nút bị tước. Nhưng không xa như tôi có thể nói: http://jsbin.com/ivufav/1/edit Đã thử nó trên Firefox, Chrome, và thậm chí cả IE7. Tất cả chúng đều có một nút với 'nodeType == 8' trong mục tiêu, do đó, không loại bỏ các bình luận. –

+7

@ SébastienRenauld: Không trùng lặp, vì câu hỏi đó chỉ định thẻ 'jquery', thẻ này không có. Nó yêu cầu một cách rõ ràng một API DOM, không phải là một thư viện. (Và OP tiếp tục làm rõ trong bình luận về một câu trả lời rằng anh ta không muốn sử dụng jQuery.) –

Trả lời

8

Có những TreeWalker API:

var tw = document.createTreeWalker(document, NodeFilter.SHOW_COMMENT, null, null), 
    comment; 
while (comment = tw.nextNode()) { 
    // ... 
} 

này không được hỗ trợ bởi IE8 và thấp hơn.

T.J. trong các nhận xét được cung cấp một số link to the specs. Tôi luôn sử dụng TreeWalkers, nhưng trong trường hợp của bạn, NodeIterator cũng không sao.

+1

+1 Ồ, và chúng thậm chí không mới: http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html Hỗ trợ như thế nào (ngoài

+0

@ T.J.Crowder Uh, chưa bao giờ làm thử nghiệm rộng rãi, nhưng Chrome, Firefox và Opera đều hỗ trợ nó. Tôi đoán bạn có thể tìm thấy nó trong trình duyệt di động. Dù sao, tôi thậm chí đã mã hóa một polyfill cho những trình duyệt không hỗ trợ nó. – MaxArt

+4

Đây là JSFiddle trước đây của tôi được cập nhật để sử dụng 'document.createTreeWalker()': http://jsfiddle.net/JCDnh/3/ nhỏ hơn và dễ đọc hơn, về mặt kỹ thuật các bước tương tự, nhưng có thể nhanh hơn nếu công cụ JavaScript là tận dụng mã gốc –

6

Thuộc tính lõi nodeType cho phép bạn phân biệt giữa các loại nút. Trong trường hợp cụ thể này, 8 đại diện cho các bình luận. Vì họ không có bộ chọn, bạn sẽ cần phải lặp qua cha mẹ của họ để có được chúng (mà hút, tôi biết). Các mã sau lọc chúng ra cho bạn:

$("*").contents().filter(function(){ 
    return this.nodeType == Node.COMMENT_NODE; 
}) 

Và jQuery-less phiên bản của riêng tôi, vì một số người không có nó:

function getAllComments() { 
    var t = [], 
     recurse = function (elem) { 
      if (elem.nodeType == Node.COMMENT_NODE) { 
       t.push(elem); 
      }; 
      if (elem.childNodes && elem.childNodes.length) { 
       for (var i = 0; i < elem.childNodes.length; i++) { 
        recurse(elem.childNodes[i]); 
       }; 
      }; 
     }; 
    recurse(document.getElementsByTagName("html")[0]); 
    return t; 
}; 

Nếu bạn muốn tìm kiếm trên một cụ thể , hãy liên kết lại cuộc gọi document.getElementsByTagName với biến mà bạn chọn.

Chỉnh sửa: fiddle để chứng minh việc sử dụng, được thực hiện bởi Jason Sperske!

+0

Và OP nói anh ta đang sử dụng jQuery ở đâu? –

+2

Nhận xét trước là chính xác, tôi không muốn một giải pháp jQuery. Chỉnh sửa: điều này có nghĩa rằng câu hỏi này là _not_ một bản sao của "Chọn nhận xét HTML với jQuery". –

+0

@ T.J.Crowder: OP * không * nói ở đâu? Tuy nhiên, tôi đã thêm một thực thi JS thuần túy. –