จะรับข้อความบริสุทธิ์โดยไม่มีองค์ประกอบ HTML โดยใช้ JavaScript ได้อย่างไร


122

ฉันมีปุ่ม 1 และข้อความบางส่วนใน HTML ของฉันดังต่อไปนี้:

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>

เมื่อผู้ใช้คลิกปุ่มเนื้อหาใน<p id='txt'>จะกลายเป็นผลลัพธ์ที่คาดหวังดังนี้

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

ใครช่วยฉันเขียนฟังก์ชัน JavaScript ได้ไหม

ขอบคุณ.


สิ่งนี้ตอบคำถามของคุณหรือไม่? Strip HTML จาก Text JavaScript
KyleMit

คำตอบ:


73

[2017-07-25] เนื่องจากสิ่งนี้ยังคงเป็นคำตอบที่ได้รับการยอมรับแม้ว่าจะเป็นวิธีแก้ปัญหาที่แฮ็กมาก แต่ฉันก็รวมโค้ดของGabiไว้ในนั้นโดยปล่อยให้รหัสของตัวเองเป็นตัวอย่างที่ไม่ดี

<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
แย่เพราะแฮ็คและช้า มีการรับประกันหรือไม่ว่าข้อความที่แสดงนั้นจะต้องไม่มีแท็ก?
Domi

1
ไม่ไม่มีการรับประกันดังกล่าว ฉันให้ข้อจำกัดความรับผิดชอบเมื่อฉันโพสต์ เห็นได้ชัดว่าเป็นไปตามวัตถุประสงค์ของ OP
jcomeau_ictx

3
การพยายามแยกวิเคราะห์ HTML ด้วยนิพจน์ทั่วไปเป็นเรื่องที่อันตรายจริงๆ - มันเป็นไปไม่ได้ในทางปฏิบัติ (ฉันสงสัยว่ามันอาจเป็นไปไม่ได้ในทางทฤษฎี ) ที่จะทำให้ถูกต้อง มีเคสขอบมากเกินไปจากนั้นโค้ดของคุณจะระเบิดเมื่อต้องเผชิญกับอินพุตแปลก ๆ ซึ่งมักใช้ประโยชน์จากการทำ XSS ได้
David Given

2
ฉันเดาว่าทำไมถึงได้รับการยอมรับ: เป็นคำตอบที่สมบูรณ์ซึ่งสามารถตัดและวางได้ทันทีตามที่อยู่ในไฟล์ html และทดสอบกับเบราว์เซอร์ ฉันไม่เคยบอกว่ามันเป็นคำตอบที่ดี ฉันโพสต์หลังจากเห็นคำตอบที่ดีทั้งหมดแล้วและไม่ได้รับการยอมรับและคิดว่า OP จำเป็นต้องมีการจัดการเล็กน้อย ยังดีพอสำหรับแอปพลิเคชันใด ๆ ที่ทราบว่าซอร์ส HTML ไม่มีวงเล็บมุมที่ไม่สมดุล
jcomeau_ictx

211

คุณสามารถใช้สิ่งนี้:

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

ขึ้นอยู่กับสิ่งที่คุณต้องการคุณสามารถใช้อย่างใดอย่างหนึ่งelement.innerTextหรือelement.textContent. พวกเขาแตกต่างกันในหลาย ๆ ด้าน innerTextพยายามประมาณว่าจะเกิดอะไรขึ้นหากคุณเลือกสิ่งที่คุณเห็น (html ที่แสดงผล) และคัดลอกไปยังคลิปบอร์ดในขณะที่textContentเรียงลำดับเพียงแถบแท็ก html และแสดงสิ่งที่เหลือ

innerText ยังมีความเข้ากันได้กับเบราว์เซอร์ IE รุ่นเก่า (มาจากที่นั่น)


3
+1 - กำลังมองหาtextวิธีการที่มีประสิทธิภาพสูงเนื่องจากมีการทำหลายอย่างในวง jQuery มีประสิทธิภาพไม่เพียงพอ แต่มันเร็วมาก ทำงานใน IE8 +, chrome, ff สมบูรณ์
Travis J

2
เก่า IE, el.textContentจะเป็นundefinedและอาจจะมีel.innerText ""แต่"" || undefinedเป็นundefined. ใช้el.innerText || el.textContent || ''อาจจะดีกว่า
Oriol

3
innerText ไม่ส่งคืนข้อความและเนื้อหาที่ซ่อนอยู่ของแท็กสคริปต์ / สไตล์ในขณะที่ textContent ทำ ถ้าคุณอยู่กับรุ่นของ IE ที่สนับสนุน textContent el.textContent || el.innerText || ""ก็อาจจะดีกว่าที่จะใช้มันเป็นครั้งแรกดังนั้น
Domino

2
เพียงแค่ทราบสำหรับทุกคนที่อ่านคำตอบนี้ในปัจจุบันมากกว่าหกปีหลังจากคำตอบนี้วันนี้คุณก็สามารถใช้var text = element.textContent;; เว้นแต่ด้วยเหตุผลบางอย่างร้ายกาจคุณยังได้ให้การสนับสนุนIE8 หรือต่ำกว่า
รหัสไร้ประโยชน์

el.innerTextจะใกล้เคียงกับel.textContent.replace(/\W+/g, ' '). พวกเขาไม่เหมือนกัน
Polv

26

หากคุณสามารถใช้ jquery มันก็ง่าย

$("#txt").text()

8
ฉันต้องบอกว่าดูคำตอบ JS ทั้งหมดแล้วดูที่คำตอบนี้ นี่เป็นเหตุผลสำคัญอันดับสองว่าทำไมฉันถึงใช้ jQuery (กล่าวคือทำให้งานง่ายขึ้นลดภาระงานและเพิ่มความสามารถในการอ่าน) เหตุผลที่สำคัญที่สุดประการแรก (สำหรับฉัน) เป็นเพราะมันจัดการปัญหาความเข้ากันได้ข้ามกันหลายอย่างฉันอาจไม่รู้ด้วยซ้ำ (เช่นใช้ jQuery เพื่อปรับความทึบเพื่อที่ฉันจะได้ไม่ต้องเขียนบรรทัดแยกต่างหากสำหรับ IE8 เพื่อกำหนดเป้าหมายfilterคุณสมบัติฉันรู้ว่า JS บริสุทธิ์ในทางเทคนิคมีประสิทธิภาพมากกว่าในเรื่องความเร็ว แต่แทบจะไม่สำคัญอีกต่อไปในเรื่องปกติ ..
VoidKing

8
pure js one ซับเทียบเท่า: document.querySelector("#txt").innerText;ผู้คนรวมไลบรารี jQuery ทั้งหมดบ่อยเกินไปเมื่อความต้องการเพียงอย่างเดียวของพวกเขาคือโค้ดสองสามบรรทัด เป็นการปฏิบัติที่ไม่ดี
Levi Johansen

10

คำตอบนี้จะใช้เพื่อรับเฉพาะข้อความสำหรับองค์ประกอบ HTML ใด ๆ

พารามิเตอร์แรก "โหนด" นี้เป็นองค์ประกอบในการรับข้อความ พารามิเตอร์ที่สองเป็นทางเลือกและถ้าเป็นจริงจะเพิ่มช่องว่างระหว่างข้อความภายในองค์ประกอบหากไม่มีช่องว่างที่นั่น

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

ขึ้นอยู่กับสิ่งที่คุณต้องการคุณสามารถใช้อย่างใดอย่างหนึ่งelement.innerTextหรือelement.textContent. พวกเขาแตกต่างกันในหลาย ๆ ด้าน innerTextพยายามประมาณว่าจะเกิดอะไรขึ้นหากคุณเลือกสิ่งที่คุณเห็น (html ที่แสดงผล) และคัดลอกไปยังคลิปบอร์ดในขณะที่textContentเรียงลำดับเพียงแถบแท็ก html และแสดงสิ่งที่เหลือ

innerText ไม่ได้เป็นเพียงใช้สำหรับ IE อีกต่อไปและจะมีการสนับสนุนในเบราว์เซอร์ที่สำคัญทั้งหมด แน่นอนtextContentว่ามันเข้ากันได้กับเบราว์เซอร์ IE รุ่นเก่า (ตั้งแต่พวกมันมา)

ตัวอย่างที่สมบูรณ์ (จากคำตอบของ Gabi ):

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

2

สิ่งนี้ได้ผลสำหรับฉันโดยรวบรวมตามสิ่งที่กล่าวไว้ในที่นี้ด้วยมาตรฐานที่ทันสมัยกว่า วิธีนี้ได้ผลดีที่สุดสำหรับการค้นหาหลาย ๆ

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


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

ที่ควรทำ.


0

ลอง ( แนวคิดคำตอบแบบสั้นของ Gabi )

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.