2012-05-24 47 views
28

thể trùng lặp:
getElementsByTagName() equivalent for textNodesTìm tất cả các nút văn bản trong trang HTML

Đối this question tôi cần phải tìm tất cả các nút văn bản dưới một nút cụ thể. Tôi thể làm điều này như sau:

function textNodesUnder(root){ 
    var textNodes = []; 
    addTextNodes(root); 
    [].forEach.call(root.querySelectorAll('*'),addTextNodes); 
    return textNodes; 

    function addTextNodes(el){ 
    textNodes = textNodes.concat(
     [].filter.call(el.childNodes,function(k){ 
     return k.nodeType==Node.TEXT_NODE; 
     }) 
    ); 
    } 
} 

Tuy nhiên, điều này dường như không thanh nha trong ánh sáng của sự thật rằng với XPath một cách đơn giản có thể truy vấn cho .//text() và được thực hiện với nó.

Cách đơn giản nhất để nhận tất cả các nút văn bản trong một phần tử cụ thể trong tài liệu HTML, hoạt động trên IE9 +, Safari5 +, Chrome19 +, Firefox12 +, Opera11 + là gì?

"Đơn giản nhất" được định nghĩa lỏng lẻo là "hiệu quả và ngắn, không chơi gôn".

+1

http: // st ackoverflow.com/questions/2579666/getelementsbytagname-equivalent-for-textnodes –

+0

Aw, bugger. Cảm ơn, Jack, tôi đã tìm kiếm nhưng không tìm thấy câu hỏi đó. – Phrogz

+0

Vâng, tôi không biết tại sao nó không hiển thị trong thanh bên, nhưng tôi tìm thấy nó trong khi thực hiện tìm kiếm của Google :) –

Trả lời

89

Dựa trên câu trả lời @ Kennebec, một thực hiện một chút chặt chẽ hơn của cùng một logic:

function textNodesUnder(node){ 
    var all = []; 
    for (node=node.firstChild;node;node=node.nextSibling){ 
    if (node.nodeType==3) all.push(node); 
    else all = all.concat(textNodesUnder(node)); 
    } 
    return all; 
} 

Tuy nhiên, cho đến nay nhanh hơn, chặt chẽ hơn, và tao nhã hơn là sử dụng createTreeWalker để các trình duyệt lọc ra mọi thứ trừ các nút văn bản cho bạn:

function textNodesUnder(el){ 
    var n, a=[], walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false); 
    while(n=walk.nextNode()) a.push(n); 
    return a; 
} 
+3

@julmot Trên máy tính của tôi, tìm kiếm tất cả các nút văn bản trên trang này bằng Chrome v50, phải mất 1900μ bằng kỹ thuật đầu tiên, nhưng 220μ sử dụng kỹ thuật TreeWalker. Vì vậy, 8 hoặc 9 lần nhanh hơn. – Phrogz

+1

Tôi đã phải tweek này để loại trừ các nội dung của '

5
function deepText(node){ 
    var A= []; 
    if(node){ 
     node= node.firstChild; 
     while(node!= null){ 
      if(node.nodeType== 3) A[A.length]=node; 
      else A= A.concat(deepText(node)); 
      node= node.nextSibling; 
     } 
    } 
    return A; 
} 
+1

Làm thế nào về 'while (node)' mà không có '! = Null'? – Phrogz

+2

Hoặc thậm chí 'cho (node ​​= node.firstChild; node; node = node.nextSibling) {...}' – Phrogz

+1

Tôi đã lo lắng rằng giải pháp đệ quy có thể chạy vào các vấn đề giới hạn stack, nhưng [tôi thấy bây giờ điều này là không] (http://stackoverflow.com/questions/7826992/browser-javascript-stack-size-limit). – Phrogz

Các vấn đề liên quan