Làm cách nào để có được văn bản thuần túy không có phần tử HTML bằng JavaScript?


122

Tôi có nút 1 và một số văn bản trong HTML của mình như sau:

function get_content(){
   // I don't know how to do in here!!!
}

<input type="button" onclick="get_content()" value="Get Content"/>
<p id='txt'>
<span class="A">I am</span>
<span class="B">working in </span>
<span class="C">ABC company.</span>
</p>

Khi người dùng nhấp vào nút, nội dung trong <p id='txt'>sẽ trở thành kết quả mong đợi sau:

<p id='txt'>
// All the HTML element within the <p> will be disappear
I am working in ABC company.
</p>

Có ai có thể giúp tôi cách viết hàm JavaScript không?

Cảm ơn bạn.


Điều này có trả lời câu hỏi của bạn không? Tách HTML khỏi JavaScript văn bản
KyleMit

Câu trả lời:


73

[2017-07-25] vì đây tiếp tục là câu trả lời được chấp nhận, mặc dù là một giải pháp rất khó hiểu, tôi đang kết hợp mã của Gabi vào đó, để lại mã của tôi để làm ví dụ xấu.

<style>
.A {background: blue;}
.B {font-style: italic;}
.C {font-weight: bold;}
</style>

<script>
// my hacky approach:
function get_content() {
     var html = document.getElementById("txt").innerHTML;
     document.getElementById("txt").innerHTML = html.replace(/<[^>]*>/g, "");
}
// Gabi's elegant approach, but eliminating one unnecessary line of code:
function gabi_content() {
    var element = document.getElementById('txt');
    element.innerHTML = element.innerText || element.textContent;
}
// and exploiting the fact that IDs pollute the window namespace:
function txt_content() {
    txt.innerHTML = txt.innerText || txt.textContent;
}
</script>

<input type="button" onclick="get_content()" value="Get Content (bad)"/>
<input type="button" onclick="gabi_content()" value="Get Content (good)"/>
<input type="button" onclick="txt_content()" value="Get Content (shortest)"/>
<p id='txt'>
<span class="A">I am</span>
<span class="B">working in </span>
<span class="C">ABC company.</span>
</p>

3
Tệ vì hacky và chậm. Thậm chí có đảm bảo rằng bản thân văn bản được hiển thị không bao giờ chứa thẻ không?
Domi

1
không, không có đảm bảo như vậy. Tôi đã từ chối trách nhiệm khi tôi đăng. nó rõ ràng đã phục vụ mục đích của OP.
jcomeau_ictx

3
Việc cố gắng phân tích cú pháp HTML bằng các biểu thức chính quy thực sự rất nguy hiểm --- thực tế là không thể (tôi nghi ngờ về mặt lý thuyết là không thể). Có quá nhiều trường hợp cạnh và sau đó mã của bạn bị nổ khi gặp phải đầu vào lạ, điều này thường có thể bị lợi dụng để thực hiện XSS.
David Given

2
suy đoán của tôi về lý do tại sao nó được chấp nhận: đó là một câu trả lời hoàn chỉnh, có thể được cắt và dán ngay lập tức vào tệp html và được kiểm tra bằng trình duyệt. Tôi không bao giờ nói đó là một tốt câu trả lời. Tôi đã đăng sau khi thấy tất cả các câu trả lời tốt đều có ở đó, và không được chấp nhận, và nhận thấy OP cần một chút giữ lại. nó vẫn đủ tốt cho bất kỳ ứng dụng nào mà nguồn HTML đã được biết là không chứa dấu ngoặc nhọn không cân bằng.
jcomeau_ictx

211

Bạn có thể sử dụng cái này:

var element = document.getElementById('txt');
var text = element.innerText || element.textContent;
element.innerHTML = text;

Tùy thuộc vào những gì bạn cần, bạn có thể sử dụng element.innerTexthoặc element.textContent. Chúng khác nhau về nhiều mặt. innerTextcố gắng ước lượng những gì sẽ xảy ra nếu bạn chọn những gì bạn thấy (html được kết xuất) và sao chép nó vào khay nhớ tạm, trong khi textContentchỉ tách các thẻ html và cung cấp cho bạn những gì còn lại.

innerText cũng có khả năng tương thích với các trình duyệt IE cũ (ra đời từ đó).


3
+1 - Đang tìm kiếm một số textphương pháp hiệu suất cao vì nó được thực hiện rất nhiều trong một vòng lặp. jQuery không đủ hiệu quả, nhưng quá trình này diễn ra rất nhanh. Làm việc trong IE8 +, chrome, ff. Hoàn hảo.
Travis J

2
Trên IE cũ, el.textContentsẽ undefinedel.innerTextcó thể có "". Nhưng "" || undefinedundefined. Sử dụng el.innerText || el.textContent || ''có thể tốt hơn.
Oriol

3
innerText không trả về văn bản ẩn và nội dung của các thẻ script / style trong khi textContent thì có. Nếu bạn đang sử dụng phiên bản IE có hỗ trợ textContent, bạn nên sử dụng nó trước el.textContent || el.innerText || "".
Domino

2
Chỉ là một lưu ý cho bất kỳ ai đọc câu trả lời này trong thời nay, hơn sáu năm sau câu trả lời này, những ngày này bạn chỉ có thể sử dụng var text = element.textContent;; trừ khi vì một số lý do không chính đáng, bạn vẫn phải hỗ trợ IE8 trở xuống .
Mã vô dụng,

el.innerTextgần giống như el.textContent.replace(/\W+/g, ' '). Chúng không giống nhau.
Polv

26

Nếu bạn có thể sử dụng jquery thì nó đơn giản

$("#txt").text()

8
Tôi chỉ phải nói rằng, hãy xem tất cả các câu trả lời JS thuần túy và sau đó nhìn vào câu trả lời này. Đây là lý do quan trọng thứ hai tại sao tôi sử dụng jQuery (tức là, nó đơn giản hóa các tác vụ, giảm khối lượng công việc của tôi và tăng khả năng đọc). Lý do quan trọng nhất đầu tiên (đối với tôi) là vì nó xử lý nhiều vấn đề tương thích chéo, nếu không thì tôi thậm chí có thể không biết (như sử dụng jQuery để điều chỉnh độ mờ, để tôi không phải viết một dòng riêng chỉ cho IE8 để nhắm mục tiêu các filterbất động sản tôi biết rằng tinh khiết JS là kỹ thuật hiệu quả hơn khi nói đến tốc độ, nhưng điều đó hầu như không quan trọng nữa trong hầu hết bình thường ...
VoidKing

8
pure js one liner tương đương: document.querySelector("#txt").innerText;Mọi người bao gồm toàn bộ thư viện jQuery quá thường xuyên khi nhu cầu duy nhất của họ là một vài dòng mã. Đó là thực hành không tốt.
Levi Johansen

10

Câu trả lời này sẽ hoạt động để chỉ lấy văn bản cho bất kỳ phần tử HTML nào.

Tham số đầu tiên "nút" là phần tử để lấy văn bản từ đó. Tham số thứ hai là tùy chọn và nếu đúng sẽ thêm khoảng trắng giữa văn bản bên trong các phần tử nếu không có khoảng trắng sẽ tồn tại ở đó.

function getTextFromNode(node, addSpaces) {
    var i, result, text, child;
    result = '';
    for (i = 0; i < node.childNodes.length; i++) {
        child = node.childNodes[i];
        text = null;
        if (child.nodeType === 1) {
            text = getTextFromNode(child, addSpaces);
        } else if (child.nodeType === 3) {
            text = child.nodeValue;
        }
        if (text) {
            if (addSpaces && /\S$/.test(result) && /^\S/.test(text)) text = ' ' + text;
            result += text;
        }
    }
    return result;
}

2

Tùy thuộc vào những gì bạn cần, bạn có thể sử dụng element.innerTexthoặc element.textContent. Chúng khác nhau về nhiều mặt. innerTextcố gắng ước lượng những gì sẽ xảy ra nếu bạn chọn những gì bạn thấy (html được kết xuất) và sao chép nó vào khay nhớ tạm, trong khi textContentchỉ tách các thẻ html và cung cấp cho bạn những gì còn lại.

innerText không chỉ được sử dụng cho IE nữa , và nó được hỗ trợ trong tất cả các trình duyệt chính . Tất nhiên, không giống như textContent, nó có khả năng tương thích với các trình duyệt IE cũ (kể từ khi họ nghĩ ra nó).

Toàn bộ ví dụ (từ câu trả lời của Gabi ):

var element = document.getElementById('txt');
var text = element.innerText || element.textContent; // or element.textContent || element.innerText
element.innerHTML = text;

2

Điều này phù hợp với tôi được biên soạn dựa trên những gì đã nói ở đây với một tiêu chuẩn hiện đại hơn. Điều này hoạt động tốt nhất cho nhiều lần tra cứu.

let element = document.querySelectorAll('.myClass')
  element.forEach(item => {
    console.log(item.innerHTML = item.innerText || item.textContent)
  })

1

Cần làm việc:

function get_content(){
   var p = document.getElementById("txt");
   var spans = p.getElementsByTagName("span");
   var text = '';
   for (var i = 0; i < spans.length; i++){
       text += spans[i].innerHTML;
   }

   p.innerHTML = text;
}

Hãy thử trò chơi này: http://jsfiddle.net/7gnyc/2/


1
function get_content(){
 var returnInnerHTML = document.getElementById('A').innerHTML + document.getElementById('B').innerHTML + document.getElementById('A').innerHTML;
 document.getElementById('txt').innerHTML = returnInnerHTML;
}

Nên làm vậy.


0

Hãy thử (phiên bản ngắn của ý tưởng câu trả lời Gabi )

function get_content() {
   txt.innerHTML = txt.textContent;
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.