Wie ersetze ich Text in einem div-Element?


166

Ich muss den Text innerhalb eines DIV-Elements dynamisch festlegen. Was ist der beste, browser-sichere Ansatz? Ich habe Prototypen und Scriptaculous zur Verfügung.

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

So sieht die Funktion aus:

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

Hat die akzeptierte Antwort das, was Sie möchten, wenn der zugewiesene Text wie folgt lautet: - <span style = "font-size: 36pt"> Dies ist groß </ span>. Wenn dieses Verhalten wünschenswert ist, können Sie die entsprechende Frage neu formulieren?
AnthonyWJones

Könnte dies bei einem XSS-Injektionsangriff verwendet werden?
James Westgate

Antworten:


49

Ich würde die updateMethode von Prototype verwenden, die einfachen Text, ein HTML-Snippet oder ein beliebiges JavaScript-Objekt unterstützt, das eine toStringMethode definiert .

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

26
@Aeyoun Das OP implizierte, dass sie bereits Prototype verwendeten. Wenn dies der Fall ist, ist es sinnvoll, dies zu nutzen.
John Topley

6
Warum funktioniert für mich nur mit$("field_name").text("new text");
Drako

@Drako Verwenden Sie PrototypeJS?
John Topley

10
@Drako Die ursprüngliche Frage und meine Antwort von vor sieben Jahren beziehen sich auf PrototypeJS und nicht auf jQuery.
John Topley

255

Sie können einfach verwenden:

fieldNameElement.innerHTML = "My new text!";

2
Sollten für "statischen" Text keine einfachen Anführungszeichen verwendet werden?
Milan Babuškov

5
In PHP ja. In JavaScript glaube ich nicht, dass es wichtig ist.
Ceejayoz

46
In Javascript sind einfache und doppelte Anführungszeichen austauschbar.
17 vom 26.

18
schlechter Rat, weil der Text versehentlich HTML-markupähnlichen Inhalt enthalten kann
Trident D'Gao

10
element.innerHTML = "<script>doSomethingMalicious()</script>";wird keine gute Idee sein. element.innerHTML = "& neither will this";
Joseph Nields

175

Aktualisiert für alle, die dies 2013 und später lesen:

Diese Antwort hat viel SEO, aber alle Antworten sind stark veraltet und hängen von Bibliotheken ab, um Dinge zu tun, die alle aktuellen Browser sofort tun.

Verwenden Sie Node.textContent, das in allen aktuellen Browsern bereitgestellt wird, um Text in einem div-Element zu ersetzen.

fieldNameElement.textContent = "New text";

10
@Legolas Daher schreibe ich vor zwei Jahren 'aktuellen Browser'.
Mikemaccana

2
Danke dir! Ich habe die anderen Antworten ausprobiert und mich gefragt, warum 'innerHTML' nicht funktioniert.
GreySage

2
Sie könnten überlegen, warum dies textContenteine überlegene Methode ist innerHTML: Sie ist schneller, sicherer und angemessener, wenn Sie nicht absichtlich versuchen, HTML-Markups einzufügen.
Bestimmte Leistung

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

Die Vorteile dieser Vorgehensweise:

  1. Es wird nur das DOM verwendet, daher ist die Technik auf andere Sprachen portierbar und basiert nicht auf dem nicht standardmäßigen innerHTML
  2. fieldName enthält möglicherweise HTML, bei dem es sich möglicherweise um einen versuchten XSS-Angriff handelt. Wenn wir wissen, dass es sich nur um Text handelt, sollten wir einen Textknoten erstellen, anstatt ihn vom Browser nach HTML analysieren zu lassen

Wenn ich eine Javascript-Bibliothek verwenden würde, würde ich jQuery verwenden und dies tun:


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

Beachten Sie, dass der Kommentar von @AnthonyWJones korrekt ist: "Feldname" ist keine besonders beschreibende ID oder Variablenname.


In welche anderen Sprachen könnten Sie diese Technik portieren?
John Topley

Jede Sprache mit einer DOM-Implementierung unterstützt dies (und die meisten Sprachen haben eine DOM-Implementierung).
Quentin

Dies ist eine gute Antwort, besser als meine und die richtige Antwort. Sie könnten jedoch in Betracht ziehen, das Beispiel aufzuräumen. 'Feldname' ist kein guter Name für den Parameter der Funktion. Tatsächlich ist es möglicherweise am besten, zwei für die Element-ID und eine für den Inhalt zu verwenden, d. H. elemID, Inhalt
AnthonyWJones

Ich habe fieldName und die ID aus der Frage selbst ausgeliehen.
Daniel Papasian

In der Frage wurde wahrscheinlich field_name verwendet, um das Beispiel generisch zu machen. Der Fragesteller erwähnt auch, dass Prototype verfügbar ist, nicht jedoch jQuery.
John Topley

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

Eines der raffinierten Merkmale von Prototype ist, dass $('field_name')es dasselbe tut wiedocument.getElementById('field_name') . Benutze es! :-)

John Topleys Antwort mit der updateFunktion von Prototype ist eine weitere gute Lösung.


4
Das sieht nicht nach JavaScript aus?
Milan Babuškov

1
Verwenden Sie kein innerHTML. Es ist keine w3c-Empfehlung und verhält sich inkonsistent. Es wird als schlechter Stil angesehen.
Tom

Tom, was sollte stattdessen verwendet werden (wenn Sie keinen Prototyp verwenden)?
Milan Babuškov

1
Mailand, die akzeptiertere Methode besteht darin, die childNodes zu durchlaufen, removeNode (true) aufzurufen und dann neue Knoten anzuhängen, die mit document.createElement () oder document.createTextNode () erstellt wurden. Wenn Sie dies tun müssen, würde ich empfehlen, eine Funktion zu schreiben, um viel Tippen zu vermeiden.
Joel Anair

3
@ RaduSimionescu Nein, ist es nicht. Diese Frage und Antwort bezieht sich auf Prototype.js, nicht auf jQuery. In Prototype $wird ein Artikel nach ID gesucht. Es ist nicht selektorbasiert wie jQuery. api.prototypejs.org/dom/dollar
ceejayoz

15

Die schnelle Antwort ist die Verwendung von innerHTML (oder der Aktualisierungsmethode des Prototyps, die so ziemlich dasselbe ist). Das Problem mit innerHTML ist, dass Sie dem zugewiesenen Inhalt entkommen müssen. Abhängig von Ihren Zielen müssen Sie dies mit anderem Code ODER tun

im IE: -

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

in FF: -

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

(Eigentlich von FF haben die folgenden in Code vorhanden)

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

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

Jetzt kann ich innerText nur verwenden, wenn Sie eine möglichst breite Browserunterstützung benötigen. Dies ist keine vollständige Lösung, aber innerHTML wird auch nicht im RAW verwendet.


7

Wenn Sie wirklich möchten, dass wir dort weitermachen, wo Sie aufgehört haben, können Sie Folgendes tun:

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

5

nodeValue ist auch eine Standard-DOM-Eigenschaft, die Sie verwenden können:

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


1

Wenn Sie dazu neigen, viel JavaScript auf Ihrer Website zu verwenden, macht jQuery das Spielen mit dem DOM extrem einfach.

http://docs.jquery.com/Manipulation

Macht es so einfach wie: $ ("# Feldname"). Text ("Ein neuer Text.");


Der Prototyp hat ähnliche Dienstprogrammfunktionen.
Ceejayoz


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

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

Es ist besser, den Knoten zu ersetzen, als ihn zu entfernen und einen neuen als zwei separate Operationen hinzuzufügen.
Quentin

0

Hier ist eine einfache jQuery- Methode:

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

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

Dies scheint eine schlechte Idee zu sein - was ist, wenn Ihr Element Unterknoten mit demselben Text enthält oder Ihr Text mit einem Teil eines Element-Tag-Namens übereinstimmt? Warum nicht nur .text verwenden?
James Westgate

Ich stimme James Westgate voll und ganz zu, sollte das nicht tun.
TGarrett

0

In HTML setzen Sie dies

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

In Javascript setzen Sie dies

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some HTML';}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.