JavaScript를 사용하여 HTML 요소없이 순수한 텍스트를 얻는 방법은 무엇입니까?


122

다음과 같은 HTML에 1 버튼과 일부 텍스트가 있습니다.

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 함수를 작성하는 방법을 도울 수 있습니까?

감사합니다.


이것이 귀하의 질문에 대답합니까? 텍스트 JavaScript에서 HTML 제거
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 2014 년

1
아니요, 그러한 보장은 없습니다. 게시 할 때 면책 조항을했습니다. 그것은 분명히 OP의 목적을 달성했습니다.
jcomeau_ictx 2014 년

3
정규 표현식으로 HTML을 파싱하는 것은 정말 위험합니다. --- 옳은 일을하는 것은 사실상 불가능합니다 ( 이론적으로 불가능할 수도 있습니다 ). 너무 많은 엣지 케이스가 있고 이상한 입력에 직면하면 코드가 폭발하여 XSS를 수행하는 데 자주 악용 될 수 있습니다.
다윗은 주어

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됩니다 undefinedel.innerText수 있습니다 "". 그러나 "" || undefined입니다 undefined. 사용하는 el.innerText || el.textContent || ''것이 더 좋을 수 있습니다.
Oriol 2015 년

3
innerText는 textContent가 수행하는 동안 숨겨진 텍스트 및 스크립트 / 스타일 태그의 내용을 반환하지 않습니다. textContent를 지원하는 IE 버전을 사용하는 경우 먼저 사용하는 것이 좋을 수 있으므로 el.textContent || el.innerText || "".
Domino

2
이 답변을 읽고 6 년 이상이 지난 현재이 답변을 읽는 모든 사람을위한 메모입니다 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 liner equivalent : document.querySelector("#txt").innerText;사람들은 코드 몇 줄만 있으면 jQuery 라이브러리 전체를 너무 자주 포함합니다. 나쁜 습관입니다.
레위 요한센

10

이 답변은 모든 HTML 요소에 대한 텍스트를 얻는 데 효과적입니다.

이 첫 번째 매개 변수 "node"는 텍스트를 가져올 요소입니다. 두 번째 매개 변수는 선택 사항이며 true 인 경우 공백이 없으면 요소 내의 텍스트 사이에 공백이 추가됩니다.

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 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;
}

이 바이올린을 사용해보십시오 : 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;
}

그렇게해야합니다.


0

시도 (Gabi 답변 아이디어 의 짧은 버전 )

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.