2012-02-18 35 views
6

Có cách nào để lấy innerText của chỉ phần tử trên cùng (và bỏ qua innerText của phần tử con) không?Có cách nào để lấy innerText của chỉ phần tử trên cùng (và bỏ qua innerText của phần tử con) không?

Ví dụ:

<div> 
    top node text 
    <div> child node text </div> 
</div> 

Làm thế nào để có được "text nút top" trong khi bỏ qua "text nút con"? innerText tài sản của div đầu dường như trở lại nối của cả hai bên trong, văn bản hàng đầu.

+1

Xóa các nút con trực tiếp không phải là văn bản đầu tiên? – Oded

+1

@Oded: Không cần. Chỉ cần lặp lại các em và ghép lại. Dễ như ăn bánh. –

Trả lời

11

Chỉ cần lặp qua các nút con và nối các nút văn bản:

var el = document.getElementById("your_element_id"), 
    child = el.firstChild, 
    texts = []; 

while (child) { 
    if (child.nodeType == 3) { 
     texts.push(child.data); 
    } 
    child = child.nextSibling; 
} 

var text = texts.join(""); 
+1

+1 Rõ ràng là tốt hơn nhân bản những gì có thể là một chút rất lớn của cây DOM, chỉ để loại bỏ hầu hết của nó. Chỉ có sự cải tiến sẽ là 'text = []' khi bắt đầu, và sau đó 'text.push (child.data)' trên mỗi lần lặp lại, và cuối cùng là 'text = text.join ('')' ở cuối để biến mảng miếng thành một chuỗi, mà có xu hướng nhanh hơn so với nối lặp lặp lại với một chuỗi ngày càng phát triển. –

+0

@DanielEarwicker: Tôi đã xem xét điều đó, nhưng tôi nghĩ rằng các tiêu chuẩn cuối cùng tôi đã đề xuất không rõ ràng rằng nó thực sự cải thiện hiệu suất vì vậy tôi đã đi cho các phiên bản đơn giản. Tôi sẽ kiểm tra ngay bây giờ. –

+1

Đẹp nhất. PS. 'dữ liệu' được định nghĩa trong giao diện [' CharacterData'] (https://developer.mozilla.org/en/DOM/CharacterData), được thực hiện bởi 'Text' (các nút văn bản). –

3
  1. Sao chép phần tử.
  2. Lặp qua tất cả các nút con (ngược lại, để tránh xung đột):
    Nếu phần tử có thuộc tính tagName, thì đó là một phần tử: Xóa nút.
  3. Sử dụng innerText để nhận nội dung văn bản (với dự phòng là textContent, khi innerText không được hỗ trợ).

Code:

var elem = document.getElementById('theelement'); 
elem = elem.cloneNode(true); 
for (var i=elem.childNodes.length-1; i>=0; i--) { 
    if (elem.childNodes[i].tagName) elem.removeChild(elem.childNodes[i]); 
} 
var innerText = elem['innerText' in elem ? 'innerText' : 'textContent']; 
+0

Ồ, hoạt động như sự quyến rũ trong tất cả các trình duyệt. Thành thật mà nói, tôi đã không nghĩ rằng nó có thể trước khi gửi câu hỏi :) ... cảm ơn bạn ... – ivymike

+2

Không cần phải sao chép hoặc đột biến DOM cả. Chỉ cần đọc các nút văn bản trẻ em. Xem câu trả lời của tôi. –

+2

@ivymike Phương pháp của Tims tốt hơn. Tôi đề nghị chấp nhận câu trả lời của anh thay vì câu trả lời của tôi. Nó cũng hoạt động trong tất cả các trình duyệt (được thử nghiệm trong IE6 +, Chrome 1+, Safari 5, Firefox 3+). –

0

Nếu bạn không muốn bỏ qua văn bản bên trong các phần tử con của, sử dụng như sau chức năng:

function getInnerText(el) { 
    var x = []; 
    var child = el.firstChild; 
    while (child) { 
     if (child.nodeType == 3) { 
      x.push(child.nodeValue); 
     } 
     else if (child.nodeType == 1) { 
      var ii = getInnerText(child); 
      if (ii.length > 0) x.push(ii); 
     } 
     child = child.nextSibling; 
    } 
    return x.join(" "); 
} 
+0

Tôi có thiếu thứ gì đó hay điều này ngược lại với những gì họ yêu cầu? – Tom

2

Điều này sẽ làm việc trong ví dụ của bạn: document.getElementById("item").firstChild.nodeValue;

Lưu ý: Hãy nhớ rằng điều này sẽ hoạt động nếu bạn biết bạn đang xử lý HTML cụ thể đó. Đoạn mã

<div> 
    <div class="item"> child node text </div> 
    top node text 
</div> 

thì bạn nên sử dụng giải pháp chung chung hơn bởi @Tim Down


đây đang làm việc:: Nếu HTML của bạn có thể thay đổi, ví dụ để

window.onload = function() { 
 
    var text = document.getElementById("item").firstChild.nodeValue; 
 
    document.getElementById("result").innerText = text.trim(); 
 
};
#result { 
 
    border: 1px solid red; 
 
}
<div id="item"> 
 
    top node text 
 
    <div> child node text </div> 
 
</div> 
 

 

 

 
<strong>Result:</strong> <div id="result"></div>

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