私はIEで動作するJavaScriptコードをいくつか持っています。
myElement.innerText = "foo";
しかし、 'innerText'プロパティはFirefoxでは機能しないようです。 Firefoxに相当するものはありますか?それとも使用できるより一般的なクロスブラウザのプロパティはありますか?
Firefoxは W3C準拠textContent プロパティを使用します。
SafariとOperaもこのプロパティをサポートしていると思います。
更新: すべての違いを詳述したブログ記事 を書いた。
FirefoxはW3C標準のNode::textContent
を使用しますが、その振る舞いはMSHTMLの独自のinnerText
(昔は他のMSHTML機能の中でも同様にコピーされたもの)とは「わずかに」異なります。
まず第一に、textContent
の空白表記はinnerText
と異なります。第二に、そしてもっと重要なことに、textContent
はすべてのSCRIPTタグの内容を含みますが、innerTextは含みません。
もっと面白いものにするために、Operaは標準のtextContent
を実装する以外に、MSHTMLのinnerText
も追加することにしましたが、textContent
として機能するように変更しました。 (実際、OperaのtextContent
とinnerText
は同じ結果を生み出しているようですが、おそらく互いにエイリアスされているだけです)。
textContent
はNode
インターフェースの一部ですが、innerText
はHTMLElement
の一部です。これは、たとえば、テキストノードからtextContent
を「取得」できるがinnerText
は「取得」できないことを意味します。
var el = document.createElement('p');
var textNode = document.createTextNode('x');
el.textContent; // ""
el.innerText; // ""
textNode.textContent; // "x"
textNode.innerText; // undefined
最後に、Safari 2.xにはバグのあるinnerText
の実装もあります。 Safariでは、innerText
は、要素が(style.display == "none"
を介して)非表示になっていないか、ドキュメントから孤立していない場合にのみ正しく機能します。それ以外の場合、innerText
は空の文字列になります。
私はtextContent
抽象化(これらの欠陥を回避するため)で遊んでいましたが、それは かなり複雑 であることが判明しました。
最善の策は、最初に正確な要件を定義し、そこから従うことです。考えられるすべてのinnerHTML
/textContent
の偏差を処理するのではなく、要素のinnerText
からタグを単純に削除することがしばしば可能です。
もちろん、DOMツリーをたどってテキストノードを再帰的に収集する方法もあります。
テキストコンテンツを設定するだけで、取得する必要がない場合は、ここで簡単なDOMバージョンを使用して、どのブラウザでも使用できます。 IE innerText拡張子またはDOM Level 3 Core textContentプロパティのいずれも必要ありません。
function setTextContent(element, text) {
while (element.firstChild!==null)
element.removeChild(element.firstChild); // remove all existing content
element.appendChild(document.createTextNode(text));
}
Prakash Kの答えによれば、FirefoxはinnerTextプロパティをサポートしていません。そのため、ユーザーエージェントがこのプロパティをサポートしているかどうかを簡単にテストし、それに応じて以下のように進めることができます。
function changeText(elem, changeVal) {
if (typeof elem.textContent !== "undefined") {
elem.textContent = changeVal;
} else {
elem.innerText = changeVal;
}
}
Javascriptの非常に単純な行は、すべてのメインブラウザで「タグのない」テキストを取得することができます。
var myElement = document.getElementById('anyElementId');
var myText = (myElement.innerText || myElement.textContent);
Element::innerText
プロパティには、GoogleのCSSスタイル "display:none
"で非表示になっているテキストがnotに含まれていることに注意してくださいChrome(同様に、他のCSSテクニックによってマスクされたコンテンツ(font-size:0、color:transparent、およびテキストが目に見える方法でレンダリングされない他のいくつかの同様の効果を含む)をドロップします。
他のCSSプロパティも考慮されます:
<br \>
は、innerTextの値に改行も生成します。ただし、Element::textContent
には、非表示であっても、適用されたCSSに関係なく、内部テキスト要素のすべてのコンテンツが含まれます。また、textContentには余分な改行や空白は生成されません。これにより、すべてのスタイルと構造、インライン/ブロックまたは内部要素の配置タイプが無視されます。
マウス選択を使用したコピー/貼り付け操作では、クリップボードに置かれているプレーンテキスト形式の非表示テキストが破棄されるため、textContent
にすべてが含まれるわけではなく、innerText
内にあるもののみ(空白/改行生成後)上記)。
これにより、両方のプロパティがGoogle Chromeでサポートされますが、コンテンツが異なる場合があります。古いブラウザは、intextTextに、textContentに現在含まれているもののようにすべて含まれています(ただし、空白/改行の生成に関する動作は一貫していませんでした)。
jQueryは、$()クエリを介して返す解析済み要素に追加された ".text()"メソッドを使用して、ブラウザ間のこれらの不整合を解決します。内部的には、「ノード」レベルでのみ動作するHTML DOMを調べることにより、問題を解決します。そのため、標準のtextContentに似たものが返されます。
注意点は、このjQueryメソッドは、コンテンツのサブ要素(<br />
など)によって画面に表示される余分なスペースや改行を挿入しないことです。
アクセシビリティ用のスクリプトを設計し、点字リーダーとの通信に使用されるプラグインなど、スタイルシートが非聴覚レンダリング用に解析される場合、このツールは、スタイル付きのスパンに追加される特定の句読点記号を含める必要がある場合、textContentを使用する必要があります「display:none」であり、通常はページに含まれます(上付き文字/下付き文字など)。そうでない場合、innerTextは点字リーダーで非常に混乱します。
HTML/CSSパーサーとDOMプロパティを使用して、CSSトリックによって隠されたテキストは通常、主要な検索エンジンによって通常無視されます(HTMLページのCSSも解析し、背景の色が対照的でないテキストも無視します)。 「innerText」は、最新のビジュアルブラウザーとまったく同じです(少なくとも、この不可視コンテンツはインデックス化されないため、ページにコンテンツをチェックするキーワードを強制的に含めるための隠しテキストは使用できません)。ただし、この非表示のテキストは、結果ページに表示されます(結果に含まれるインデックスからページがまだ修飾されている場合)。完全なHTMLの代わりに "textContent"プロパティを使用して、余分なスタイルとスクリプトを取り除きます。
これらの2つのプロパティのいずれかにプレーンテキストを割り当てると、内部のマークアップとそれに適用されるスタイルが上書きされます(割り当てられた要素のみがそのタイプ、属性、スタイルを保持します)ので、両方のプロパティに同じコンテンツが含まれます。ただし、一部のブラウザーはinnerTextへの書き込みを受け入れなくなり、textContentプロパティのみを上書きできるようになります(これらのプロパティへの書き込み時にHTMLマークアップを挿入することはできません。 、innerHTML
またはinnerText
の割り当て後にtextContent
プロパティを読み取る場合。
myElement.innerText = myElement.textContent = "foo";
編集(Mark Amery氏のコメントへの感謝):(例えば) jQuery のように、コードがこれらのプロパティの存在をチェックすることに依存しないことを合理的な疑いを超えて知っている場合に限り、これを行ってください。 =ありません。しかし、jQueryを使っているのなら、他の答えが示すように、おそらく "text"関数を使って$( '#myElement')。text( 'foo')を実行するだけでしょう。
innerText
がFirefoxに追加され、FF45リリースで利用可能になるはずです。 https://bugzilla.mozilla.org/show_bug.cgi?id=264412
ドラフト仕様が書かれており、将来的にはHTMLの生活標準に組み込まれる予定です。 http://rocallahan.github.io/innerText-spec/ 、 https:/ /github.com/whatwg/html/issues/465
現在、Firefox、Chrome、およびIEの実装はすべて互換性がありません。今後は、古いIEに互換性がないまま、Firefox、Chrome、Edgeが収束することを期待できます。
また参照してください: https://github.com/whatwg/compat/issues/5
Firefox v45以降の2016年のように、innerText
はFirefoxで動作します。そのサポートを見てください。 http://caniuse.com/#search=innerText
Firefoxの以前のバージョンで動作させたい場合は、textContent
を使用できます。これは、Firefoxではサポートが改善されていますが、古いIEバージョンではさらに悪くなります: http://caniuse.com/#search=textContent
このようなものはどうですか?
//$elem is the jQuery object passed along.
var $currentText = $elem.context.firstChild.data.toUpperCase();
**私は鉱山を大文字にする必要がありました。
これはinnerText
、textContent
、innerHTML
、およびvalueに関する私の経験です。
// elem.innerText = changeVal; // works on ie but not on ff or ch
// elem.setAttribute("innerText", changeVal); // works on ie but not ff or ch
// elem.textContent = changeVal; // works on ie but not ff or ch
// elem.setAttribute("textContent", changeVal); // does not work on ie ff or ch
// elem.innerHTML = changeVal; // ie causes error - doesn't work in ff or ch
// elem.setAttribute("innerHTML", changeVal); //ie causes error doesn't work in ff or ch
elem.value = changeVal; // works in ie and ff -- see note 2 on ch
// elem.setAttribute("value", changeVal); // ie works; see note 1 on ff and note 2 on ch
ie = Internet Explorer、ff = firefox、ch = google chromeです。注意1:値がバックスペースで削除されるまで、ffは機能します - 上記のRay Vegaによる注意を参照してください。注2:多少クロムで動作します - 更新後は変更されていないため、クリックして離れてフィールドに戻ると値が表示されます。一番良いのはelem.value = changeVal
です。私は上でコメントしませんでした。
元の投稿の下のコメントから再投稿するだけです。 innerHTMLはすべてのブラウザで機能します。ありがとうstefita。
myElement.innerHTML = "foo";