218 votes

Comment remplacer un élément du DOM en place en utilisant Javascript ?

Je cherche à remplacer un élément dans le DOM.
Par exemple, il existe un <a> que je veux remplacer par un élément <span> à la place.

Comment pourrais-je faire ça ?

17 votes

target.replaceWith(element); est la façon moderne (ES5+) de faire ceci

2 votes

@Gibolt Qu'est-ce que la spécification DOM a avec ES ? De plus, il ne fait pas encore partie de la norme DOM, alors que ES5 a été publié il y a 9 ans.

1 votes

ES5+ signifie ES5 OR LATER. Même si l'ES5 a 9 ans, les versions ultérieures ne sont pas aussi anciennes.

228voto

Bjorn Tipling Points 16243

En utilisant replaceChild() :

<html>
<head>
</head>
<body>
  <div>
    <a id="myAnchor" href="http://www.stackoverflow.com">StackOverflow</a>
  </div>
<script type="text/JavaScript">
  var myAnchor = document.getElementById("myAnchor");
  var mySpan = document.createElement("span");
  mySpan.innerHTML = "replaced anchor!";
  myAnchor.parentNode.replaceChild(mySpan, myAnchor);
</script>
</body>
</html>

7 votes

Cet exemple ne fonctionnerait pas. Vous devriez mettre le bloc script à la fin du corps pour que cela fonctionne. En outre, juste pour le plaisir : essayez d'ajouter la ligne [alert(myAnchor.innerHTML)] après l'opération.

0 votes

Il y a une faute d'orthographe avec StackOverflow dans l'ancre innerText.

8 votes

Et s'il s'agit de l'élément Root html

148voto

Gibolt Points 4072

A.replaceWith(span) - Aucun parent n'est nécessaire

Forme générique :

target.replaceWith(element)

Bien meilleur/plus propre que la méthode précédente.

Pour votre cas d'utilisation :

A.replaceWith(span)

Utilisation avancée

  1. Vous pouvez passer plusieurs valeurs (ou utiliser l'opérateur de propagation ... ).
  2. Toute valeur de type chaîne sera ajoutée en tant qu'élément de texte.

Exemples :

// Initially [child1, target, child3]

target.replaceWith(span, "foo")     // [child1, span, "foo", child3]

const list = ["bar", span]
target.replaceWith(...list, "fizz")  // [child1, "bar", span, "fizz", child3]

Manipulation en toute sécurité null cible

Si votre cible a une chance d'être nulle, vous pouvez envisager d'utiliser la nouvelle fonction ?. chaînage facultatif opérateur. Rien ne se passera si la cible n'existe pas. Lire la suite aquí .

target?.replaceWith?.(element)

Méthodes DOM connexes

  1. Lire la suite - child.before y child.after
  2. Lire la suite - parent.prepend y parent.append

Docs Mozilla

Navigateurs pris en charge - 95 % octobre 21

13 votes

Non supporté dans IE11 ou Edge 14 (maintenant : 2016-11-16).

4 votes

Essayez d'utiliser Closure de Google ou un autre transpilateur pour convertir en ES5. Vous ne devriez pas écrire du vieux code basé sur le support du navigateur, si vous avez une meilleure option, plus facile à maintenir.

1 votes

Ainsi, le transpilage. Vous pouvez optimiser, minifier et réduire la conversion en une seule opération. Regardez ça : développeurs.google.fr/fermeture/compilateur

68voto

Kamarey Points 4416
var a = A.parentNode.replaceChild(document.createElement("span"), A);

a est l'élément A remplacé.

2 votes

La réponse de @Bjorn Tipling ne fonctionne pas en fait. Voici la réponse (correcte !) de KooiInc, également correcte, commentaire . Maintenant ça marche ! ;-) Tx aux deux !

9 votes

Vous auriez pu trouver un autre nom de variable que A lol

7voto

Zeliax Points 1311

Cette question est très ancienne, mais je me suis retrouvé à étudier pour une certification Microsoft, et dans le livre d'étude il était suggéré d'utiliser :

oldElement.replaceNode(newElement)

J'ai vérifié et il semble qu'il ne soit supporté que par IE. Doh

J'ai pensé l'ajouter ici comme une note latérale amusante ;)

3voto

Sean Points 681

J'ai eu un problème similaire et j'ai trouvé ce fil de discussion. Replace ne fonctionnait pas pour moi, et le fait de passer par le parent était difficile dans ma situation. Inner Html remplaçait les enfants, ce qui n'était pas non plus ce que je voulais. L'utilisation de outerHTML a permis de faire le travail. J'espère que cela aidera quelqu'un d'autre !

currEl = <div>hello</div>
newElem = <span>Goodbye</span>
currEl.outerHTML = newElem
# currEl = <span>Goodbye</span>

0 votes

C'est très astucieux mais je ne sais pas si c'est conforme aux normes. Merci !

0 votes

Probablement qu'il est mondialement utilisé et je vote pour que la réponse soit la meilleure !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X