Comment copier les attributs d'un élément dans un autre?
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
Vous pouvez utiliser la propriété Node#attributes
native: 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"));
Une solution de travail sur jsfiddle
MODIFIER
Jsfiddler mis à jour
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>
Cela copie les attributs #bdiv
dans #adiv
.
Assez simple
function cloneAttributes(element, sourceNode) {
let attr;
let attributes = Array.prototype.slice.call(sourceNode.attributes);
while(attr = attributes.pop()) {
element.setAttribute(attr.nodeName, attr.nodeValue);
}
}
Nous pourrions également essayer d'étendre l'objet prototype jQuery ($.fn
) pour fournir une nouvelle méthode pouvant être chaî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 comme suit:
$(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 sur http://jsfiddle.net/roeburg/Z8x8x/
J'espère que cela t'aides.
Je suis confronté au même problème et après avoir investi beaucoup de temps et d’efforts, je crée ce clone textarea en div éditable avec le même attribut
select.getAttributeNames().forEach(attrName => {
$(div).attr(attrName, inputData.getAttribute(attrName));
});
Une solution non-jquery:
function copy(element){
var clone = document.createElement(element.nodeName);
for(key in element){
clone.setAttribute(key,element[key]);
}
return clone;
}
Il copie des méthodes et d'autres choses dont vous n'avez probablement pas besoin, mais j'espère que cela ne vous dérange pas. Ce code est petit et simple.
Syntaxe ES6 one liner:
function cloneAttributes(target, source) {
[...source.attributes].forEach( attr => { target.setAttribute(attr.nodeName ,attr.nodeValue) })
}
Et comme indiqué dans le premier commentaire - vous ne voudriez probablement pas copier l'attribut source id ... donc celui-ci sera enregistré en tant qu'attribut "data-id" au cas où vous auriez besoin d'une référence.
function cloneAttributes(target, source) {
[...source.attributes].forEach( attr => { target.setAttribute(attr.nodeName === "id" ? 'data-id' : attr.nodeName ,attr.nodeValue) })
}
Vous pouvez essayer ceci:
function copyAttributes(from, to)
{
$($(from)[0].attributes).
each(function(){$(to).attr(this.nodeName, this.nodeValue);});
return $(to);
};
L'instruction return vous permet d'écrire des choses comme:
copyAttributes(some_element, $('<div></div>')).append(...) ...
J'espère que cela t'aides.
Depuis Firefox 22, Node.attributes n'est plus pris en charge (non implémenté par d'autres navigateurs et retiré de la spécification). Il est uniquement pris en charge sur Element (Element.attributes).
solution Javascript
Copier les attributs de l'ancien élément dans le nouvel élément
const $oldElem = document.querySelector('.old')
const $newElem = document.createElement('div')
Array.from($oldElem.attributes).map(a => {
$newElem.setAttribute(a.name, a.value)
})
Remplacez l'ancien élément par le nouvel, si nécessaire
$oldElem.parentNode.replaceChild($newElem, $oldElem)