Come posso sostituire il testo all'interno di un elemento div?


166

Devo impostare dinamicamente il testo all'interno di un elemento DIV. Qual è il miglior approccio sicuro per i browser? Ho prototypejs e scriptaculous disponibili.

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

Ecco come sarà la funzione:

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

La risposta accettata fa quello che vuoi quando il testo assegnato è: - <span style = "font-size: 36pt"> Questo è grande </span>. Se questo comportamento è desiderabile, puoi riformulare la domanda in modo che corrisponda?
AnthonyWJones,

Potrebbe essere usato in un attacco di iniezione XSS?
James Westgate,

Risposte:


49

Vorrei utilizzare il updatemetodo di Prototype che supporta il testo normale, uno snippet HTML o qualsiasi oggetto JavaScript che definisce un toStringmetodo.

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

26
@Aeyoun L'OP implicava che stavano già utilizzando Prototype, quindi in tal caso ha senso approfittarne.
John Topley

6
Perché per me funziona solo con$("field_name").text("new text");
Drako il

@Drako Stai usando PrototypeJS?
John Topley,

10
@Drako La domanda originale e la mia risposta di sette anni fa sono per PrototypeJS non jQuery.
John Topley,

255

Puoi semplicemente usare:

fieldNameElement.innerHTML = "My new text!";

2
Le virgolette singole non dovrebbero essere utilizzate per il testo "statico"?
Milano Babuškov,

5
In PHP, sì. In JavaScript, non credo che sia importante.
Ceejayoz,

46
In Javascript, le virgolette singole e doppie sono intercambiabili.
17 del 26

18
cattivo consiglio, perché il testo potrebbe contenere contenuti simili a markup HTML per caso
Trident D'Gao,

10
element.innerHTML = "<script>doSomethingMalicious()</script>";non sarà una buona idea. element.innerHTML = "& neither will this";
Joseph Nields,

175

Aggiornato per tutti coloro che leggono questo nel 2013 e in seguito:

Questa risposta ha molto SEO, ma tutte le risposte sono gravemente obsolete e dipendono dalle librerie per fare cose che tutti gli attuali browser fanno immediatamente.

Per sostituire il testo all'interno di un elemento div, utilizzare Node.textContent, fornito in tutti i browser correnti.

fieldNameElement.textContent = "New text";

10
@Legolas Quindi scrivendo 'browser corrente' due anni fa.
mikemaccana,

2
Grazie! Stavo provando le altre risposte, chiedendomi perché "innerHTML" non funzionasse.
GreySage,

2
Potresti considerare di approfondire il motivo per cui textContentè un metodo superiore a innerHTML: è più veloce, più sicuro e più appropriato quando non cerchi deliberatamente di inserire markup HTML.
CertainPerformance

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

I vantaggi di farlo in questo modo:

  1. Utilizza solo il DOM, quindi la tecnica è portabile in altre lingue e non si basa sull'HTML interno non standard
  2. fieldName potrebbe contenere HTML, che potrebbe essere un tentativo di attacco XSS. Se sappiamo che è solo testo, dovremmo creare un nodo di testo, invece di far analizzare il browser per HTML

Se avessi usato una libreria javascript, avrei usato jQuery e avrei fatto questo:


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

Nota che il commento di @AnthonyWJones è corretto: "field_name" non è un ID particolarmente descrittivo o un nome di variabile.


In quali altre lingue potresti portare questa tecnica?
John Topley,

Qualsiasi lingua con un'implementazione DOM supporta questo (e la maggior parte delle lingue ha un'implementazione DOM).
Quentin,

Questa è una buona risposta, migliore della mia ed è la risposta corretta. Potresti considerare di mettere in ordine l'esempio però. 'fieldname' non è un buon nome per il parametro della funzione. In effetti potrebbe essere meglio prenderne due uno per l'ID elemento e un altro per il contenuto, ovvero; elemID, content
AnthonyWJones,

Ho preso in prestito fieldName e l'ID dalla domanda stessa.
Daniel Papasian,

La domanda probabilmente ha usato field_name per rendere generico l'esempio. Inoltre, l'interrogante menziona che Prototype è disponibile ma non jQuery.
John Topley,

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

Una delle caratteristiche eleganti di Prototype è che $('field_name')fa la stessa cosa di document.getElementById('field_name'). Usalo! :-)

La risposta di John Topley usando la updatefunzione di Prototype è un'altra buona soluzione.


4
Non sembra JavaScript?
Milano Babuškov,

1
Non usare innerHTML. Non è una raccomandazione di W3C e si comporta in modo incoerente. È considerato cattivo stile.
Tom,

Tom, cosa dovrebbe essere usato invece (se non usi Prototype)?
Milano Babuškov,

1
Milano, il modo più accettato è quello di scorrere i nodi figlio, chiamare removeNode (true) su ciascuno, quindi aggiungere nuovi nodi creati utilizzando document.createElement () o document.createTextNode (). Se hai bisogno di farlo, consiglierei di scrivere una funzione per evitare di scrivere molto.
Joel Anair,

3
@RaduSimionescu No, non lo è. Questa domanda e risposta riguarda Prototype.js, non jQuery. In Prototype $cerca un oggetto per ID. Non è basato su selettori come lo è jQuery. api.prototypejs.org/dom/dollar
ceejayoz,

15

La risposta rapida è usare innerHTML (o il metodo di aggiornamento del prototipo che è praticamente la stessa cosa). Il problema con innerHTML è che devi evitare il contenuto assegnato. A seconda dei tuoi obiettivi dovrai farlo con un altro codice OPPURE

in IE: -

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

in FF: -

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

(In realtà di FF hanno il seguente presente in codice)

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

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

Ora posso usare innerText se hai bisogno del più ampio supporto possibile per il browser, quindi questa non è una soluzione completa, ma nemmeno sta usando innerHTML in raw.


7

Se vuoi davvero che continuiamo da dove eri rimasto, potresti fare:

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

5

nodeValue è anche una proprietà DOM standard che è possibile utilizzare:

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

Meglio sostituire il nodo quindi rimuoverlo e aggiungerne uno nuovo come due operazioni separate.
Quentin,

0

Ecco un modo semplice per jQuery :

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

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

Sembra una cattiva idea: cosa succederebbe se il tuo elemento contenesse nodi secondari con lo stesso testo o se il tuo testo corrispondesse a una parte del nome di un tag elemento? Perché non usare solo .text?
James Westgate,

Sono completamente d'accordo con James Westgate, non dovrei farlo.
TGarrett,

0

In HTML metti questo

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

In Javascript metti questo

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some HTML';}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.