67 votes

jQuery : comment changer le nom d'une balise ?

JQuery : comment changer le nom d'une balise ?

Par exemple :

<tr>
    $1
</tr>

J'ai besoin

<div>
    $1
</div>

Oui, je peux

  1. Créer l'élément DOM <div>
  2. Copier le contenu de tr dans div
  3. Retirer tr du dom

Mais puis-je le faire directement ?

PS :

    $(tr).get(0).tagName = "div"; 

résulte en DOMException .

5 votes

Dans ce cas particulier, il ne serait pas judicieux de simplement le "renommer" car div ne sera pas un élément valide lorsque tr est situé.

0 votes

Voir ce post pour une solution plus complète qui inclut tous les attributs : stackoverflow.com/questions/2815683/

1 votes

Vous pouvez également utiliser display:block pour faire un tr agir et ressembler à un div sans changer le nom de la balise mais vous voudriez probablement display:block ifier l'intérieur td également avec quelque chose comme tr,tr>td{display:block} .

53voto

jAndy Points 93076

Vous pouvez remplacer n'importe quelle balise HTML en utilisant l'outil jQuery .replaceWith() método.

exemple : http://jsfiddle.net/JHmaV/

Réf. : . replaceWith

Si vous voulez conserver le balisage existant, vous pouvez utiliser un code comme celui-ci :

$('#target').replaceWith('<newTag>' + $('#target').html() +'</newTag>')

19 votes

Cela fonctionnera, mais vous ne reporterez pas les propriétés de l'élément dom (styles, événements), etc. Je ne pense pas qu'il existe un bon moyen de vraiment réaliser un changement complet de nom de nœud.

9 votes

Désolé, ce n'est PAS un "renommage", cela détruit tout le contenu (tous les changements innerHTML !).

1 votes

Il s'agit d'un remplacement, pas d'un renommage !

47voto

gustavogb Points 2681

Non, ce n'est pas possible selon la spécification du W3C : "nom de balise de type DOMString, en lecture seule".

http://www.w3.org/TR/DOM-Level-2-Core/core.html

0 votes

Je pense que la question de puchu ne concerne que la "procédure de renommage" ( !), et il y a une "DOM laideur" pour faire un renommage : 1) createElement(new_name) 2) copier tout le contenu vers le nouvel élément ; 3) remplacer l'ancien par le nouveau par replaceChild()

16voto

Peter Krauss Points 1888

Où se trouve la méthode DOM renameNode() ?

Aujourd'hui (2014), aucun navigateur ne comprend le nouvelle méthode DOM3 renameNode (voir également W3C ) vérifiez si elle fonctionne sur votre bowser : http://jsfiddle.net/k2jSm/1/

Donc, une solution DOM est laid et je ne comprends pas pourquoi ( ??) jQuery n'a pas mis en place une solution de contournement ?

algorithme DOM pur

  1. createElement(new_name)
  2. copier tout le contenu dans le nouvel élément ;
  3. remplacer l'ancien par le nouveau en replaceChild()

est quelque chose comme ça,

function rename_element(node,name) {
    var renamed = document.createElement(name); 
    foreach (node.attributes as a) {
        renamed.setAttribute(a.nodeName, a.nodeValue);
    }
    while (node.firstChild) {
        renamed.appendChild(node.firstChild);
    }
    return node.parentNode.replaceChild(renamed, node);
}

... attendre la révision et jsfiddle ...

Algorithme jQuery

L'algorithme de @ilpoldo est un bon point de départ,

   $from.replaceWith($('<'+newname+'/>').html($from.html()));

Comme d'autres l'ont dit, il faut une copie d'attribut... attendez le générique...

spécifique pour class , préserver l'attribut voir http://jsfiddle.net/cDgpS/

Voir aussi https://stackoverflow.com/a/9468280/287948

7voto

ilpoldo Points 416

Pour préserver le contenu interne de la balise, vous pouvez utiliser l'accesseur .html() en collaboration avec .replaceWith()

exemple de fourche : http://jsfiddle.net/WVb2Q/1/

2 votes

Comment sauvegarder tous les attributs d'un élément ?

0 votes

Juste ce que je cherchais +1. Les attributs ne sont pas inclus dans les autres solutions, jusqu'à présent, celle-ci est une meilleure solution.

0 votes

Non, cela ne préserve pas les attributs.

1voto

user856027 Points 19

Pour remplacer le contenu interne de multiple chacun avec son propre contenu original, vous devez utiliser .replaceWith() y .html() différemment :

http://jsfiddle.net/kcrca/VYxxG/

0 votes

C'est une copie de la solution de @ilpoldo, et peut être mieux comme commentée ici. Une solution copiée doit être supprimée.

0 votes

J'ai utilisé ceci car jquery mobile génère parfois des doubles sélections.

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