JavaScriptを使用してHTML要素のない純粋なテキストを取得する方法は?


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関数の記述方法を教えてください。

ありがとうございました。


これはあなたの質問に答えますか?テキストJavaScriptからHTMLを
削除

回答:


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
ハックと遅いので悪い。レンダリングされたテキスト自体にタグが含まれてはならないという保証さえありますか?
ドミ

1
いいえ、そのような保証はありません。投稿時に免責事項を記載しました。それは明らかにOPの目的を果たした。
jcomeau_ictx 2014年

3
正規表現でHTMLを解析しようとすることは本当に危険です--- 正しくすることは実際には不可能です(理論的には不可能かもしれません)。エッジケースが多すぎて、奇妙な入力に直面するとコードが爆発し、XSSを実行するために悪用されることがよくあります。
Davidが

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 +、クロム、FFで働いていました。完璧です。
Travis J

2
古いIEで、el.textContentになりますundefinedし、el.innerTextあるかもしれません""。しかし"" || undefinedですundefined。使用el.innerText || el.textContent || ''することをお勧めします。
Oriol

3
innerTextは隠しテキストとスクリプト/スタイルタグのコンテンツを返しませんが、textContentは返します。textContentをサポートするIEのバージョンを使用している場合は、最初にそれを使用することをお勧めしますel.textContent || el.innerText || ""
ドミノ

2
この回答を読んだ人、この回答から6年以上経過している人のためのメモですvar text = element.textContent;。最近はそのまま使用できます。なんらかの理由でIE8以下をサポートする必要がある場合を除きます
役に立たないコード

el.innerTextとほぼ同じel.textContent.replace(/\W+/g, ' ')です。彼らは同じではありません。
Polv

26

jqueryを使用できる場合、その単純な

$("#txt").text()

8
私は言う必要があります、純粋なJSの答えをすべて見て、次にこれを見てください。これが、jQueryを使用する2番目に重要な理由です(つまり、タスクを簡素化し、作業負荷を減らし、読みやすさを向上させます)。(私にとって)最初の最も重要な理由は、それが多くの相互互換性の問題を処理するためです。そうでなければ、私は気付かないかもしれません(jQueryを使用して不透明度を調整するなど、IE8のためだけに別の行を書く必要がないようにします)ターゲットにfilterプロパティを私はそれが高速になると、純粋なJSは技術的に、より効率的であることを知っているが、それはほとんど...ほとんどの正常ではもはや重要ません。
VoidKing

8
純粋なjs 1行の同等物:document.querySelector("#txt").innerText;数行のコードのみが必要な場合、人々はjQueryライブラリ全体を非常に頻繁にインクルードします。それは悪い習慣です。
Levi Johansen 2018年

10

この回答は、任意のHTML要素のテキストのみを取得するために機能します。

この最初のパラメーター「ノード」は、テキストを取得する要素です。2番目のパラメーターはオプションです。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

試してみてください(ガビの回答のアイデアの短縮版)

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.