Wie ändere ich den Text eines span-Elements in JavaScript?

388

Wenn ich eine Zeitspanne habe, sagen Sie:

<span id="myspan"> hereismytext </span>

Wie verwende ich JavaScript, um "hereismytext" in "newtext" zu ändern?

user105033
quelle

Antworten:

636

Für moderne Browser sollten Sie Folgendes verwenden:

document.getElementById("myspan").textContent="newtext";

Ältere Browser wissen textContentdies möglicherweise nicht , es wird jedoch nicht empfohlen, es zu verwenden, innerHTMLda es eine XSS-Sicherheitsanfälligkeit einführt, wenn der neue Text vom Benutzer eingegeben wird (siehe andere Antworten unten für eine detailliertere Diskussion):

//POSSIBLY INSECURE IF NEWTEXT BECOMES A VARIABLE!!
document.getElementById("myspan").innerHTML="newtext";
Gregoire
quelle
2
@bouncingHippo document.getElementById ("myspan"). setAttribute ("style", "cssvalues");
Gregoire
3
Es sollte eine Möglichkeit geben, diese beiden Antworten zu einer zusammenzuführen. Es ist genau die gleiche Antwort.
Hermann Ingjaldsson
7
Dadurch wird der Text nicht festgelegt , sondern der HTML-Code, der sich grundlegend unterscheidet.
Brad
22
@gregoire - Wie andere bereits betont haben, ist Ihre Antwort für XSS anfällig. Diese Frage wurde bereits etwa 80.000 Mal gestellt, was bedeutet, dass wahrscheinlich viele Leute diese Lösung übernommen haben und möglicherweise unnötige xss-Lecks eingeführt haben. Könnten Sie erwägen, Ihre Antwort zu aktualisieren, um sie textContentstattdessen zu verwenden , sodass neue Personen dazu ermutigt werden, geeignete und sichere Methoden anzuwenden?
Tiddo
2
@Tiddo textContent wird in IE8 und darunter nicht unterstützt und ich hoffe für Sie, dass Sie niemals direkt nicht bereinigte Benutzereingaben in Ihrem Skript verwenden.
Gregoire
75

Die Verwendung von innerHTML wird daher NICHT EMPFOHLEN . Stattdessen sollten Sie einen textNode erstellen. Auf diese Weise "binden" Sie Ihren Text und sind zumindest in diesem Fall nicht anfällig für einen XSS-Angriff.

document.getElementById("myspan").innerHTML = "sometext"; //INSECURE!!

Der richtige Weg:

span = document.getElementById("myspan");
txt = document.createTextNode("your cool text");
span.appendChild(txt);

Weitere Informationen zu dieser Sicherheitsanfälligkeit: Cross Site Scripting (XSS) - OWASP

Bearbeitet am 4. November 2017:

Die dritte Codezeile wurde gemäß dem Vorschlag von @mumush geändert : "Verwenden Sie stattdessen appendChild ();".
Übrigens, laut @Jimbo Jonny sollte alles als Benutzereingabe behandelt werden, indem das Prinzip "Sicherheit nach Ebenen" angewendet wird . Auf diese Weise werden Sie keine Überraschungen erleben.

nicooo.
quelle
6
Während Sie sind absolut korrekt zu innerHTMLerfordern Vorsicht, beachten Sie, dass Ihre Lösung verwendet , innerTextdie nicht in Firefox unterstützt wird. quirksmode.org/dom/html Es wird auch verwendet, textContentwas in IE8 nicht unterstützt wird. Sie können Code strukturieren, um diese Probleme zu umgehen.
Trott
4
Verwenden Sie span.appendChild(txt);stattdessen!
Mumush
34
Die Frage sagt nichts über Benutzereingaben aus, daher ist eine pauschale Aussage, innerHTMLdie nicht empfohlen wird, lächerlich. Ganz zu schweigen davon, dass es nach der Desinfektion immer noch in Ordnung ist. Die Idee, dass man Benutzereingaben bereinigen sollte, hängt SO NICHT mit dieser spezifischen Frage zusammen. Am Ende verdient es höchstens eine kleine Anmerkung mit der Aufschrift "Übrigens: Wenn es sich um Benutzereingaben handelt, stellen Sie sicher, dass Sie zuerst bereinigen oder die X-Methode verwenden, die sie nicht benötigt" .
Jimbo Jonny
Außerdem ist das Erstellen von Elementen viel schneller als die Verwendung von innerHTML.
Samuel Rondeau-Millaire
4
Durch die Verwendung von appendChild wird der Text nicht geändert , sondern nur hinzugefügt . Wenn Sie Ihren Code hier verwenden, würde die Spanne von der ursprünglichen Frage am Ende "hereismytextyour cool text" lauten. Vielleicht span.innerHTML = "";dann appendChild?
ShaneSauce
29
document.getElementById('myspan').innerHTML = 'newtext';
Dan
quelle
24

EDIT: Dies wurde im Jahr 2014 geschrieben. Sie interessieren sich wahrscheinlich nicht mehr für IE8 und können die Verwendung vergessen innerText. Einfach benutzen textContentund fertig, Hurra.

Wenn Sie derjenige sind, der den Text liefert, und kein Teil des Textes vom Benutzer (oder einer anderen Quelle, die Sie nicht kontrollieren) geliefert wird, ist die Einstellung innerHTMLmöglicherweise akzeptabel:

// * Fine for hardcoded text strings like this one or strings you otherwise 
//   control.
// * Not OK for user-supplied input or strings you don't control unless
//   you know what you are doing and have sanitized the string first.
document.getElementById('myspan').innerHTML = 'newtext';

Wenn Sie jedoch nicht die Quelle für einen Teil der Textzeichenfolge sind, innerHTMLkann die Verwendung von, wie andere bemerken, zu Angriffen durch Inhaltsinjektion wie XSS führen, wenn Sie nicht zuerst darauf achten, den Text ordnungsgemäß zu bereinigen.

Wenn Sie Eingaben des Benutzers verwenden, haben Sie folgende Möglichkeiten, dies sicher zu tun und gleichzeitig die browserübergreifende Kompatibilität aufrechtzuerhalten:

var span = document.getElementById('myspan');
span.innerText = span.textContent = 'newtext';

Firefox unterstützt nicht innerTextund IE8 unterstützt nicht, textContentdaher müssen Sie beide verwenden, wenn Sie die browserübergreifende Kompatibilität beibehalten möchten.

Und wenn Sie Rückflüsse (verursacht durch innerText) nach Möglichkeit vermeiden möchten :

var span = document.getElementById('myspan');
if ('textContent' in span) {
    span.textContent = 'newtext';
} else {
    span.innerText = 'newtext';
}
Trott
quelle
18

Ich benutze Jqueryund keiner der oben genannten hat geholfen, ich weiß nicht warum, aber das hat funktioniert:

 $("#span_id").text("new_value");
Shellbye
quelle
7

Hier ist ein anderer Weg:

var myspan = document.getElementById('myspan');

if (myspan.innerText) {
    myspan.innerText = "newtext";
}
else
if (myspan.textContent) {
        myspan.textContent = "newtext";   
}

Die innerText-Eigenschaft wird von Safari, Google Chrome und MSIE erkannt. Für Firefox war die Standardmethode die Verwendung von textContent, aber seit Version 45 hat es auch eine innerText-Eigenschaft, wie mich kürzlich jemand freundlicherweise bestätigt hat. Diese Lösung testet, ob ein Browser eine dieser Eigenschaften unterstützt, und weist in diesem Fall den "neuen Text" zu.

Live-Demo: hier

slevy1
quelle
1
Firefox hat die innerText-Unterstützung in Version 45 implementiert .
user3351605
4

Neben dem reinen Javascript Antworten oben, Sie jQuery verwenden können Text Methode , wie folgend:

$('#myspan').text('newtext');

Wenn Sie die Antwort erweitern müssen, um den HTML- Inhalt eines span- oder div-Elements abzurufen / zu ändern , können Sie Folgendes tun:

$('#mydiv').html('<strong>new text</strong>');

Verweise:

.text (): http://api.jquery.com/text/

.html (): http://api.jquery.com/html/

Mohamed Nagieb
quelle
1

Sie können auch die querySelector () -Methode verwenden, vorausgesetzt, die 'myspan'-ID ist eindeutig, da die Methode das erste Element mit dem angegebenen Selektor zurückgibt:

document.querySelector('#myspan').textContent = 'newtext';

developer.mozilla

Addis
quelle
0

Wie in anderen Antworten werden innerHTML und innerText nicht empfohlen. Verwenden Sie besser textContent . Dieses Attribut wird gut unterstützt. Sie können dies überprüfen: http://caniuse.com/#search=textContent

Hazlo8
quelle
0
document.getElementById("myspan").textContent="newtext";

Dadurch wird der Dom-Knoten mit der ID ausgewählt myspanund der Textinhalt in geändertnew text

Überlaufunternehmen
quelle
0

Du kannst tun

 document.querySelector ("[Span]"). textContent = "content_to_display"; 

trustidkid
quelle
Was ist der Unterschied zu der Antwort, die ich gegeben habe?
Addis
-1

Für diese Zeitspanne

<span id="name">sdfsdf</span>

Sie können so gehen: -

$("name").firstChild.nodeValue = "Hello" + "World";
Dhiraj Himani
quelle