innerText vs innerHTML vs label vs text vs textContent vs outerText


124

JavaScriptが入力されたドロップダウンリストがあります。

負荷時に表示するデフォルト値を決定する際、次のプロパティはまったく同じ値を示すことに気付きました。

  • innerText
  • innerHtml
  • label
  • text
  • textContent
  • outerText

私自身の調査では、ベンチマークテストまたはそれらのいくつかの間の比較を示していますが、すべてではありません。

私は自分の常識を使用して、同じ結果を提供するのでどちらか一方を選択できますが、データが変更された場合、これは良い考えではないのではないかと心配しています。

私の発見は:

  • innerText 値をそのまま表示し、含まれている可能性のあるHTML形式を無視します
  • innerHTML 値を表示し、HTMLフォーマットを適用します
  • labelと同じようinnerTextに見えるので、違いがわかりません
  • textinnerTextjQuery省略バージョンと同じように見えますが
  • textContentと同じように見えますが、innerTextフォーマットを維持します(など\n
  • outerText と同じように見える innerText

私の研究は私の研究が正しければ、何の特別な約がある場合にも、これまでのところ私は私が考えるか公開されているものを読むことができるものをテストすることができるよういずれかの確認を私にすることができます取ることができますlabelouterText


11
テキストにアクセスするための非常に多くの異なる方法がある理由の1つは、ブラウザー間の違いによるものです。すでにjQueryを使用.text()している場合は、を使用して要素のテキストコンテンツを取得する必要があります。これにより、ブラウザー間の最大のサポートが提供されます。
JLRishe 2014年

回答:


101

MDNから:

Internet Explorerはelement.innerTextを導入しました。意図は[textContent]とほとんど同じですが、いくつかの違いがあります。

  • textContentは<script>および<style>要素を含むすべての要素のコンテンツを取得しますが、ほとんど同等のIE固有のプロパティであるinnerTextは取得しません。

  • innerTextもスタイルを認識し、非表示要素のテキストを返しませんが、textContentは返します。

  • innerTextはCSSスタイルを認識しているため、リフローをトリガーしますが、textContentはトリガーしません。

したがってinnerText、CSSによって非表示になっているテキストは含まれませんが、含まれますtextContent

innerHTMLは、その名前が示すとおりにHTMLを返します。多くの場合、要素内のテキストを取得または書き込むために、innerHTMLを使用します。代わりにtextContentを使用する必要があります。テキストはHTMLとして解析されないため、パフォーマンスが向上する可能性があります。さらに、これによりXSS攻撃ベクトルが回避されます。

あなたはそれを逃した場合、私はより明確にそれを繰り返すみましょう:Doがない使用.innerHTMLあなたが、具体的要素内にHTMLを挿入しようとすると、あなたが挿入されているHTMLは、悪質なコンテンツが含まれていないことを保証するために必要な事前注意を受けている場合を除きます。テキストのみを挿入する.textContent場合、またはIE8以前をサポートする必要がある場合は、機能検出を使用して.textContentとをオフに切り替え.innerTextます。

非常に多くの異なるプロパティがある主な理由は、ブラウザーごとにこれらのプロパティの名前が元々異なっていたにもかかわらず、それらのすべてに対する完全なクロスブラウザーサポートがまだないためです。jQueryを使用している場合は、.text()ブラウザ間の違いを滑らかにするように設計されているため、jQueryを使用する必要があります。*

他のいくつかの場合:outerHTMLinnerHTML属する要素の開始タグと終了タグが含まれていることを除いて、基本的にと同じです。outerText全然説明がつかないようです。これはおそらくあいまいなレガシープロパティであり、回避する必要があります。


3
このドキュメントのアドバイスの問題in order to retrieve or write text within an element, people use innerHTML. textContent should be used insteadは、textContentがIE 8でサポートされていないことです。これは、Windows 7にバンドルされているバージョンであるため、かなり広く使用されています。また、FireFoxはinnerTextをサポートしていません。そのため、innerHTMLは目的に最適ではありませんが、ブラウザ間の信頼性が向上します。
Adi Inbar、2015年

5
@AdiInbar古いブラウザをサポートする必要がある場合は、行うには正しい事は間をオフにする特徴検出を使用することです.textContent.innerText、またはこれらのブラウザの違い滑らかにすることをjQueryのようなものを使用します。
JLRishe

1
説明ありがとうございました!グラフを表示するためにフロートを使用していますが、ffがtextContentを使用しているため、フロートはffに表示されませんでした。tickFormatterを使用したとき、Innertextは常に未定義でした。
Rainhider 2015

1
@bvl textContentHTMLタグでは使用できません。あなたがHTMLを挿入する必要がある場合は、いずれかを使用します.innerHTMLか使ってHTMLノードの構築document.createElement()など、
JLRishe

4
セキュリティ:(innerHTMLとは異なりtextContent)を誤って使用すると、アプリケーションへのXSS(クロスサイトスクリプティング)攻撃の可能性があります。DOMに挿入されるコンテンツがinnerHTML完全に信頼されていない場合、攻撃者は<script>要素を使用して、ユーザーまたは管理者の承認レベルで認証されたアプリケーションを乗っ取ることができます。のような奇妙な攻撃<img src="x.x" onerror="alert('Hacked!');"/>や無数のスニーカー攻撃を含むすべての攻撃textContentは、危険なの代わりにこのコンテキストで使用するだけで効果的に破壊されますinnerHTML
ChaseMoskal 2016年

8

ドロップダウンリストはOptionオブジェクトのコレクションで構成されているため、.textプロパティを使用して要素のテキスト表現を検査する必要があります。

<option value="123">text goes here</option>
                    ^^^^^^^^^^^^^^

ところで、

.text.innerTextJQueryの省略バージョンと同じであるように見える

それは正しくありません。$(element).text()はjQueryバージョンelement.textですが、プロパティアクセスバージョンです。


5

JLRisheのその他の優れた答えの補遺:

innerTextとouterTextの両方が存在する理由は、innerHTMLとouterHTMLとの対称性のためです。これは、プロパティに割り当てるときに重要になります。

eHTMLコードの要素があるとします<b>Lorem Ipsum</b>

e.innerHTML = "<i>Hello</i> World!"; => <b><i>Hello</i> World!</b>
e.outerHTML = "<i>Hello</i> World!"; =>    <i>Hello</i> World!
e.innerText = "Hello World!";        => <b>Hello World!</b>
e.outerText = "Hello World!";        =>    Hello World!



0

textlabel余分なスペースを削除します。ドロップダウンでオプションをクエリすると、次の結果が得られました。

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