76 votes

Comment copier tous les attributs d'un élément et les appliquer à un autre ?

Comment copier les attributs d'un élément vers un autre élément ?

HTML

<select id="foo" class="bar baz" style="display:block" width="100" data-foo="bar">...</select>

<div>No attributes yet</div>

JavaScript

var $div = $('div');
var $select = $('select');

//now copy the attributes from $select to $div

2 votes

Vous êtes sûr de vouloir copier id ?

0 votes

S'il s'agit de copier le id vous aurez une copie de l'attribut id .

0 votes

Peut-être pourriez-vous expliquer pourquoi vous avez besoin de cela ? Il y a probablement une meilleure solution.

89voto

pimvdb Points 66332

Vous pouvez utiliser la fonction native Node#attributes propriété : http://jsfiddle.net/SDWHN/16/ .

var $select = $("select");
var $div = $("div");

var attributes = $select.prop("attributes");

// loop through <select> attributes and apply them on <div>
$.each(attributes, function() {
    $div.attr(this.name, this.value);
});

alert($div.data("foo"));

1 votes

Remarque : le tableau des attributs est loin d'être compatible. Oui, il s'agit d'un élément central, mais les versions antérieures d'IE traitent les propriétés "centrales" comme bon leur semble. J'utilise le terme "hackish", mais paradoxalement plus conforme à la façon dont il a été pris à partir de forum.jquery.com/topic/ - faire du noeud une représentation de chaîne, changer sa balise avec regexp et reconvertir en noeud. Ensuite, je peux rattacher les données et les événements. La version IE a généré des erreurs lors de la copie de certains attributs (par exemple l'attribut 'implementation' - saviez-vous qu'il est attaché à toutes les balises ?)

8 votes

Félicitations pour avoir fait précéder vos variables de "$" lorsqu'elles contiennent des références à des objets jQuery. J'ai lancé cette tendance dans mon entreprise actuelle... cela facilite énormément la lecture rapide du code !

0 votes

J'aimerais poser une question annexe à ce sujet. J'ai essayé $something.prop('attributes') et cela donne un tableau avec des attributs. L'un d'entre eux est crossorigin pour une image. J'ai essayé $item.prop('crossorigin') qui est indéfini mais si j'essaie $item.prop('src') il donne le résultat. Et puis j'ai essayé $item.attr('crossorigin') qui donnent la valeur. Quelle est la différence entre .attr() y .prop() ? Pourquoi la situation ci-dessus est-elle quelque peu différente ? Merci d'avance.

11voto

Tocco Points 872

Une solution fonctionnelle sur jsfiddle

EDIT

Mise à jour de jsfiddler

Javascript

$(function(){
    var destination = $('#adiv').eq(0);
    var source = $('#bdiv')[0];

    for (i = 0; i < source.attributes.length; i++)
    {
        var a = source.attributes[i];
        destination.attr(a.name, a.value);
    }
});

HTML

<div id="adiv" class="aclass">A class</div>
<div id="bdiv" class="bclass">B class</div>

C'est une copie #bdiv attributs à #adiv .

4 votes

Vous devriez poster au moins la partie importante de votre code ici, ne serait-ce que pour la raison que si jsfiddle disparaît un jour, votre réponse restera.

0 votes

@kingjiv, Merci de me conseiller.

0 votes

Il semble qu'il y ait un problème dans IE (8) où il trouve beaucoup trop de propriétés (100+) et où jQuery jette une exception de membre non trouvé en essayant de définir l'attribut.

3voto

Ro Hit Points 81

Nous pouvons également essayer d'étendre le prototype jQuery ( $.fn ) pour fournir une nouvelle méthode qui peut être enchaînée à la fonction jQuery().

Voici une extension de la solution de @pimvdb pour fournir une fonction qui copie tous les attributs

L'utilisation serait la suivante :

 $(destinationElement).copyAllAttributes(sourceElement);

La fonction d'extension peut être définie comme suit :

(function ($) {

    // Define the function here
    $.fn.copyAllAttributes = function(sourceElement) {

        // 'that' contains a pointer to the destination element
        var that = this;

        // Place holder for all attributes
        var allAttributes = ($(sourceElement) && $(sourceElement).length > 0) ?
            $(sourceElement).prop("attributes") : null;

        // Iterate through attributes and add    
        if (allAttributes && $(that) && $(that).length == 1) {
            $.each(allAttributes, function() {
                // Ensure that class names are not copied but rather added
                if (this.name == "class") {
                    $(that).addClass(this.value);
                } else {
                    that.attr(this.name, this.value);
                }

            });
        }

        return that;
    }; 

})(jQuery);

Un exemple est disponible à l'adresse suivante http://jsfiddle.net/roeburg/Z8x8x/

J'espère que cela vous aidera.

1 votes

Votre code contient des duplications inutiles de wrappers/initialisations jQuery. Voir mes modifications : jsfiddle.net/5eLdcya6

0voto

MuTLY Points 1

Depuis Firefox 22, Node.attributes n'est plus pris en charge (non implémenté par les autres navigateurs et retiré de la spécification). Il n'est pris en charge que par Element (Element.attributes).

1 votes

Cela n'a aucune importance pour le PO, il ne parle pas des textos ou autres nœuds.

-2voto

Johnny Craig Points 2820
$("div").addClass($('#foo').attr('class'));

1 votes

Mon erreur, je pensais que tu voulais copier le css.

0 votes

Bien que ce soit une erreur, c'est exactement ce que je cherchais sur Google. Donc, merci ! ;)

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