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
}
sblundy
quelle
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");
John Topley
quelle
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!";
17 von 26
quelle
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";
Mikemaccana
quelle
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.

Daniel Papasian
quelle
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.

ceejayoz
quelle
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.

AnthonyWJones
quelle
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';
Milan Babuškov
quelle
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";
}
palswim
quelle
4
el.innerHTML='';
el.appendChild(document.createTextNode("yo"));
Adrian Adkison
quelle
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.");

Steve Perks
quelle
Der Prototyp hat ähnliche Dienstprogrammfunktionen.
Ceejayoz
1

Verwenden innertext wenn Sie nicht Struktur annehmen - Verwenden Sie Text # Daten vorhandenen Text aktualisieren Leistungstest

Jugend kippt um
quelle
0
function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);

  fieldNameElement.removeChild(fieldNameElement.firstChild);
  var newText = document.createTextNode("New Text");
  fieldNameElement.appendChild(newText);
}
Hollystyles
quelle
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"));
Cosmin
quelle
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';}
Azhar Hussain
quelle