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.