div要素内のテキストを置き換えるにはどうすればよいですか?


166

DIV要素内のテキストを動的に設定する必要があります。ブラウザを安全に使用するための最善の方法は何ですか?私はprototypejsとscriptaculousを利用できます。

<div id="panel">
  <div id="field_name">TEXT GOES HERE</div>
</div>

関数は次のようになります。

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById('field_name');
  //Make replacement here
}

受け入れられた回答は、次のようなテキストが割り当てられたときに、期待どおりに動作しますか?-<span style = "font-size:36pt">これは大きいです</ span>。この動作が望ましい場合は、質問を言い換えて一致させることができますか?
AnthonyWJones 2008

これはXSSインジェクション攻撃で使用できますか?
James Westgate、2012年

回答:


49

updateプレーンテキスト、HTMLスニペット、またはtoStringメソッドを定義するJavaScriptオブジェクトをサポートするプロトタイプのメソッドを使用します。

$("field_name").update("New text");

26
@Aeyoun OPは、彼らがすでにプロトタイプを使用していたことを暗示したので、その場合はそれを利用するのが理にかなっています。
John Topley 2013

6
なぜ私だけが動作するのですか$("field_name").text("new text");
Drako、

@Drako PrototypeJSを使用していますか?
John Topley

10
@Drako 7年前の元の質問と私の回答は、jQueryではなくPrototypeJSに対するものです。
John Topley

255

あなたは単に使うことができます:

fieldNameElement.innerHTML = "My new text!";

2
「静的」テキストに一重引用符を使用しないでください。
ミラノバブスコフ

5
PHPでは、そうです。JavaScriptでは、それが重要だとは思いません。
ceejayoz 2008

46
JavaScriptでは、一重引用符と二重引用符は交換可能です。

18
テキストが誤ってHTMLマークアップのようなコンテンツを含む可能性があるため、不適切なアドバイス
Trident D'Gao

10
element.innerHTML = "<script>doSomethingMalicious()</script>";良い考えではありません。element.innerHTML = "& neither will this";
ジョセフNields 16

175

2013年以降にこれを読むすべての人のために更新:

この回答には多くのSEOが含まれていますが、すべての回答は非常に古く、現在のすべてのブラウザがそのまま使用できることをライブラリに依存しています。

div要素内のテキストを置き換えるには、現在のすべてのブラウザーで提供されているNode.textContentを使用します。

fieldNameElement.textContent = "New text";

10
@Legolasしたがって、2年前に「現在のブラウザ」を書いています。
mikemaccana 2015年

2
ありがとうございました!私は他の答えを試していましたが、なぜ「innerHTML」が機能しなかったのだろうと思いました。
GreySage 2017

2
HTMLマークアップを意図的に挿入しようとしない場合は、より速く、安全で、より適切なtextContent方法である理由を詳しく説明することを検討innerHTMLしてください。
特定のパフォーマンス

75

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById("field_name");
  while(fieldNameElement.childNodes.length >= 1) {
    fieldNameElement.removeChild(fieldNameElement.firstChild);
  }
  fieldNameElement.appendChild(fieldNameElement.ownerDocument.createTextNode(fieldName));
}

このようにすることの利点:

  1. DOMのみを使用するため、この手法は他の言語に移植可能であり、非標準のinnerHTMLに依存しません。
  2. fieldNameにはHTMLが含まれている可能性があり、これはXSS攻撃の試みの可能性があります。それが単なるテキストであることがわかっている場合は、ブラウザでHTMLを解析するのではなく、テキストノードを作成する必要があります。

JavaScriptライブラリを使用する場合は、jQueryを使用して、次のようにします。


  $("div#field_name").text(fieldName);

@AnthonyWJonesのコメントは正しいことに注意してください。「field_name」は、特に説明的なIDや変数名ではありません。


このテクニックを他のどの言語に移植できますか?
John Topley

DOM実装を備えたすべての言語がこれをサポートします(ほとんどの言語にはDOM実装があります)。
クエンティン

これは良い答えです。私の答えよりも優れており、正しい答えです。ただし、例を整理することを検討してください。'fieldname'は関数のパラメーターに適した名前ではありません。実際には、要素ID用に1つとコンテンツ用にもう1つを使用するのが最善です。elemID、コンテンツ
AnthonyWJones 2008

質問自体からfieldNameとIDを借りました。
Daniel Papasian 2008

質問ではおそらくfield_nameを使用して例を一般的にしました。また、質問者は、Prototypeは利用できるがjQueryは利用できないと述べています。
John Topley、

17
$('field_name').innerHTML = 'Your text.';

プロトタイプの気の利いた機能の一つは、それがある$('field_name')のと同じことをやっdocument.getElementById('field_name')です。これを使って!:-)

プロトタイプのupdate関数を使用したJohn Topleyの答えは、別の良い解決策です。


4
それはJavaScriptのように見えませんか?
ミラノバブスコフ

1
innerHTMLは使用しないでください。これはw3cの推奨事項ではなく、動作に一貫性がありません。それは悪いスタイルだと考えられています。
トム

トム、代わりに何を使用すべきですか(プロトタイプを使用しない場合)?
ミラノバブスコフ2008

1
ミラノでは、より受け入れられた方法は、childNodesをループして、それぞれでremoveNode(true)を呼び出し、次にdocument.createElement()またはdocument.createTextNode()を使用して作成された新しいノードを追加することです。あなたがそれをする必要があるなら、私は多くのタイプを避けるために関数を書くことを勧めます。
Joel Anair 2008

3
@RaduSimionescuいいえ、そうではありません。この質問と回答は、jQueryではなくPrototype.jsに関するものです。プロトタイプで$は、IDでアイテムを検索します。jQueryのようにセレクターベースではありません。api.prototypejs.org/dom/dollar
ceejayoz

15

簡単な答えは、innerHTML(またはプロトタイプの更新メソッドとほぼ同じもの)を使用することです。innerHTMLの問題は、割り当てられているコンテンツをエスケープする必要があることです。ターゲットに応じて、他のコードでそれを行う必要がありますOR

IEで:-

document.getElementById("field_name").innerText = newText;

FF:-

document.getElementById("field_name").textContent = newText;

(実際にはFFには次のコードが存在します)

HTMLElement.prototype.__defineGetter__("innerText", function () { return this.textContent; })

HTMLElement.prototype.__defineSetter__("innerText", function (inputText) { this.textContent = inputText; })

可能な限り幅広いブラウザーサポートが必要な場合は、innerTextを使用できます。これは完全なソリューションではありませんが、innerHTMLをそのまま使用することもありません。


7

本当に中断したところから続行したい場合は、次のようにします。

if (fieldNameElement)
    fieldNameElement.innerHTML = 'some HTML';

5

nodeValueは、使用できる標準のDOMプロパティでもあります。

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);
  if(fieldNameElement.firstChild)
    fieldNameElement.firstChild.nodeValue = "New Text";
}




0
function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);

  fieldNameElement.removeChild(fieldNameElement.firstChild);
  var newText = document.createTextNode("New Text");
  fieldNameElement.appendChild(newText);
}

ノードを交換してから削除し、2つの個別の操作として新しいノードを追加することをお勧めします。
クエンティン

0

簡単なjQueryの方法は次のとおりです。

var el = $('#yourid .yourclass');

el.html(el.html().replace(/Old Text/ig, "New Text"));

これは悪い考えのようです-要素に同じテキストのサブノードが含まれていた場合、またはテキストが要素タグ名の一部と一致した場合はどうなりますか?なぜ.textを使用しないのですか?
James Westgate

James Westgateに完全に同意します。そうすべきではありません。
TGarrett 2015年

0

HTMLでこれを入れて

<div id="field_name">TEXT GOES HERE</div>

JavaScriptでこれを入れて

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some HTML';}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.