Comment remplacer du texte dans un élément div?

166

J'ai besoin de définir le texte dans un élément DIV de manière dynamique. Quelle est la meilleure approche sécurisée pour le navigateur? J'ai des prototypes et des scriptaculous disponibles.

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

Voici à quoi ressemblera la fonction:

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById('field_name');
  //Make replacement here
}
sblundy
la source
Est-ce que la réponse acceptée fait ce que vous voulez quand un texte lui est attribué comme: - <span style = "font-size: 36pt"> C'est gros </span>. Si ce comportement est souhaitable, pouvez-vous reformuler la question pour qu'elle corresponde?
AnthonyWJones
Cela pourrait-il être utilisé dans une attaque par injection XSS?
James Westgate

Réponses:

49

J'utiliserais la updateméthode de Prototype qui prend en charge le texte brut, un extrait de code HTML ou tout objet JavaScript qui définit une toStringméthode.

$("field_name").update("New text");
John Topley
la source
26
@Aeyoun L'OP impliquait qu'ils utilisaient déjà Prototype, donc si c'est le cas, il est logique d'en profiter.
John Topley
6
Pourquoi pour moi ne fonctionne qu'avec$("field_name").text("new text");
Drako
@Drako Utilisez-vous PrototypeJS?
John Topley
10
@Drako La question originale et ma réponse d'il y a sept ans sont pour PrototypeJS et non pour jQuery.
John Topley
255

Vous pouvez simplement utiliser:

fieldNameElement.innerHTML = "My new text!";
17 sur 26
la source
2
Les guillemets simples ne devraient-ils pas être utilisés pour le texte «statique»?
Milan Babuškov
5
En PHP, oui. En JavaScript, je ne pense pas que cela compte.
ceejayoz
46
En Javascript, les guillemets simples et doubles sont interchangeables.
17 du 26
18
mauvais conseil, car le texte peut contenir du contenu de type HTML par accident
Trident D'Gao
10
element.innerHTML = "<script>doSomethingMalicious()</script>";ne sera pas une bonne idée. element.innerHTML = "& neither will this";
Joseph Nields
175

Mis à jour pour tous ceux qui liront ceci en 2013 et après:

Cette réponse a beaucoup de SEO, mais toutes les réponses sont sérieusement obsolètes et dépendent des bibliothèques pour faire des choses que tous les navigateurs actuels font hors de la boîte.

Pour remplacer du texte à l'intérieur d'un élément div, utilisez Node.textContent, qui est fourni dans tous les navigateurs actuels.

fieldNameElement.textContent = "New text";
Mikemaccana
la source
10
@Legolas D'où l'écriture de «navigateur actuel» il y a deux ans.
mikemaccana
2
Je vous remercie! J'essayais les autres réponses, me demandant pourquoi «innerHTML» ne fonctionnait pas.
GreySage
2
Vous pourriez envisager d'expliquer pourquoi textContentest une méthode supérieure pour innerHTML: c'est plus rapide, plus sûr et plus approprié lorsque vous n'essayez pas délibérément d'insérer du balisage 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));
}

Les avantages de le faire de cette façon:

  1. Il n'utilise que le DOM, donc la technique est portable dans d'autres langages et ne repose pas sur le innerHTML non standard
  2. fieldName peut contenir du HTML, ce qui pourrait être une tentative d'attaque XSS. Si nous savons que ce n'est que du texte, nous devrions créer un nœud de texte, au lieu de demander au navigateur de l'analyser pour HTML

Si j'allais utiliser une bibliothèque javascript, j'utiliserais jQuery et ferais ceci:


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

Notez que le commentaire de @AnthonyWJones est correct: "field_name" n'est pas un identifiant ou un nom de variable particulièrement descriptif.

Daniel Papasian
la source
Dans quelles autres langues pourriez-vous porter cette technique?
John Topley
N'importe quel langage avec une implémentation DOM prend en charge cela (et la plupart des langages ont une implémentation DOM).
Quentin
C'est une bonne réponse, meilleure que la mienne et c'est la bonne réponse. Vous pourriez cependant envisager de ranger l'exemple. «fieldname» n'est pas un bon nom pour le paramètre de la fonction. En fait, il pourrait être préférable d'en prendre deux, un pour l'ID d'élément et un autre pour le contenu, c'est-à-dire; elemID, content
AnthonyWJones
J'ai emprunté fieldName et l'ID de la question elle-même.
Daniel Papasian le
La question utilisait probablement field_name pour rendre l'exemple générique. Le questionneur mentionne également que Prototype est disponible mais pas jQuery.
John Topley
17
$('field_name').innerHTML = 'Your text.';

L'une des fonctionnalités intéressantes de Prototype est qu'il $('field_name')fait la même chose que document.getElementById('field_name'). Utilise le! :-)

La réponse de John Topley en utilisant la updatefonction de Prototype est une autre bonne solution.

ceejayoz
la source
4
Cela ne ressemble pas à JavaScript?
Milan Babuškov
1
N'utilisez pas innerHTML. Ce n'est pas une recommandation du W3C et se comporte de manière incohérente. C'est considéré comme un mauvais style.
Tom
Tom, que faut-il utiliser à la place (si vous n'utilisez pas Prototype)?
Milan Babuškov
1
Milan, la méthode la plus acceptée consiste à parcourir les childNodes, à appeler removeNode (true) sur chacun d'eux, puis à ajouter de nouveaux nœuds créés à l'aide de document.createElement () ou document.createTextNode (). Si vous avez besoin de le faire, je recommanderais d'écrire une fonction pour éviter de trop taper.
Joel Anair
3
@RaduSimionescu Non, ce n'est pas le cas. Cette question et réponse concerne Prototype.js, pas jQuery. Dans Prototype $recherche un élément par ID. Ce n'est pas basé sur un sélecteur comme jQuery. api.prototypejs.org/dom/dollar
ceejayoz
15

La réponse rapide est d'utiliser innerHTML (ou la méthode de mise à jour du prototype qui est à peu près la même chose). Le problème avec innerHTML est que vous devez échapper au contenu attribué. En fonction de vos objectifs, vous devrez le faire avec un autre code OU

dans IE: -

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

en FF: -

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

(En fait, les FF ont les éléments suivants présents par code)

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

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

Maintenant, je peux simplement utiliser innerText si vous avez besoin d'une prise en charge de navigateur la plus large possible, ce n'est pas une solution complète, mais l'utilisation de innerHTML non plus dans le brut.

AnthonyWJones
la source
7

Si vous voulez vraiment que nous continuions là où vous vous êtes arrêté, vous pouvez faire:

if (fieldNameElement)
    fieldNameElement.innerHTML = 'some HTML';
Milan Babuškov
la source
5

nodeValue est également une propriété DOM standard que vous pouvez utiliser:

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);
  if(fieldNameElement.firstChild)
    fieldNameElement.firstChild.nodeValue = "New Text";
}
palswim
la source
4
el.innerHTML='';
el.appendChild(document.createTextNode("yo"));
Adrian Adkison
la source
1

Si vous êtes enclin à commencer à utiliser beaucoup de JavaScript sur votre site, jQuery rend le jeu avec le DOM extrêmement simple.

http://docs.jquery.com/Manipulation

Le rend aussi simple que: $ ("# field-name"). Text ("Some new text.");

Steve Perks
la source
Le prototype a des fonctions utilitaires similaires.
ceejayoz
1

Utilisez innerText si vous ne pouvez pas assumer la structure - Utilisez les données Text # pour mettre à jour le test de performance du texte existant

Renversement de la jeunesse
la source
0
function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);

  fieldNameElement.removeChild(fieldNameElement.firstChild);
  var newText = document.createTextNode("New Text");
  fieldNameElement.appendChild(newText);
}
houx
la source
Mieux vaut remplacer le nœud puis le supprimer et en ajouter un nouveau en deux opérations distinctes.
Quentin
0

Voici un moyen simple de jQuery :

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

el.html(el.html().replace(/Old Text/ig, "New Text"));
Cosmin
la source
Cela semble être une mauvaise idée - et si votre élément contenait des sous-nœuds avec le même texte ou si votre texte correspondait à une partie du nom d'une balise d'élément? Pourquoi ne pas utiliser uniquement .text?
James Westgate
Je suis entièrement d'accord avec James Westgate, je ne devrais pas faire ça.
TGarrett
0

En HTML, mettez ceci

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

En Javascript, mettez ceci

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some HTML';}
Azhar Hussain
la source