библиотека jQuery: как скопировать все атрибуты одного элемента и применить их к другому?
Как скопировать атрибуты одного элемента на другой?
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
11 ответов:
Вы можете использовать родной
Node#attributes
свойство: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"));
EDIT
Обновлено 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>
это копирование
#bdiv
атрибуты#adiv
.
Очень Просто
function cloneAttributes(element, sourceNode) { let attr; let attributes = Array.prototype.slice.call(sourceNode.attributes); while(attr = attributes.pop()) { element.setAttribute(attr.nodeName, attr.nodeValue); } }
мы также можем попробовать расширить прототип jQuery (
$.fn
) объект для предоставления нового метода, который может быть привязан к функции jQuery ().вот расширение решения @pimvdb для предоставления функции, которая копирует все атрибуты
использование было бы так:
$(destinationElement).copyAllAttributes(sourceElement);
функция расширения может быть определена следующим образом:
(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);
пример доступен по адресу http://jsfiddle.net/roeburg/Z8x8x/
надеюсь, что это помогает.
не-jquery решение:
function copy(element){ var clone = document.createElement(element.nodeName); for(key in element){ clone.setAttribute(key,element[key]); } return clone; }
он копирует методы и другие вещи, которые вам, вероятно, не нужны, но, надеюсь, вы не возражаете. Этот код небольшой и простой.
я столкнулся с той же проблемой и после вложенных много времени и усилий я создаю этоклонировать textarea в редактируемый div с тем же атрибутом
select.getAttributeNames().forEach(attrName => { $(div).attr(attrName, inputData.getAttribute(attrName)); });
Начиная С Firefox 22, Узел.атрибуты больше не поддерживаются (не реализованы другими браузерами и удалены из спецификации). Он поддерживается только на элементе (Element.атрибуты.)
Вы можете попробовать это:
function copyAttributes(from, to) { $($(from)[0].attributes). each(function(){$(to).attr(this.nodeName, this.nodeValue);}); return $(to); };
оператор return позволяет писать такие вещи, как:
copyAttributes(some_element, $('<div></div>')).append(...) ...
надеюсь, что это помогает.
синтаксис ES6 один лайнер:
function cloneAttributes(target, source) { [...source.attributes].forEach( attr => { target.setAttribute(attr.nodeName ,attr.nodeValue) }) }
и как отмечено в первом комментарии - вы, вероятно, не хотите копировать атрибут source id... так что этот сохранит его как атрибут "data-id" в случае, если вам нужна ссылка.
function cloneAttributes(target, source) { [...source.attributes].forEach( attr => { target.setAttribute(attr.nodeName === "id" ? 'data-id' : attr.nodeName ,attr.nodeValue) }) }
Javascript решение
скопируйте атрибуты старого элемента в новый элемент
const $oldElem = document.querySelector('.old') const $newElem = document.createElement('div') Array.from($oldElem.attributes).map(a => { $newElem.setAttribute(a.name, a.value) })
замените старый элемент на новый, если требуется
$oldElem.parentNode.replaceChild($newElem, $oldElem)