2012-02-07 15 views
13

Tôi đang cố viết một bookmarklet gọi hàm doSomething(textNode) trên tất cả các phiên bản văn bản có thể nhìn thấy trên tài liệu.Tìm tất cả các nút văn bản

doSomething(), chỉ để giải trí, thay thế mọi từ bằng "derp" bằng cách thay thế textContent của textNode được truyền vào nó. Tuy nhiên, điều này làm cho một số textNodes trống để có các từ trong đó, do đó nó phá vỡ trang web.

Có cách nào để gọi doSomething() chỉ trên mỗi textNode có từ trong đó không?

function recurse(element) 
{ 
    if (element.childNodes.length > 0) 
     for (var i = 0; i < element.childNodes.length; i++) 
      recurse(element.childNodes[i]); 

    if (element.nodeType == Node.TEXT_NODE && element.nodeValue != '') 
     doSomething(element); 
} 
var html = document.getElementsByTagName('html')[0]; 
recurse(html); 

Trả lời

10

Thay đổi này ...

element.nodeValue != '' 

này ...

/\S/.test(element.nodeValue) 

này sử dụng /\S/ regex, mà tìm kiếm ít nhất một nhân vật phi không gian.

Bạn có thể cần xác định thêm ý nghĩa của từ "từ". Tôi lấy nó để có nghĩa là bạn chỉ loại trừ các nút chỉ khoảng trắng.


Trong trình duyệt hỗ trợ String.prototype.trim, đây sẽ là một sự thay thế ...

element.nodeValue.trim() != ''