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
}

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

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!";

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";

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.


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.


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.


7

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

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

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


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.");


Le prototype a des fonctions utilitaires similaires.
ceejayoz


0
function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);

  fieldNameElement.removeChild(fieldNameElement.firstChild);
  var newText = document.createTextNode("New Text");
  fieldNameElement.appendChild(newText);
}

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

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';}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.