Я помітив, що перша відповідь була не зовсім те, що мені потрібно, тому я зробив кілька модифікацій і подумав, що опублікую її тут.
Поліпшено replaceTag(<tagName>)
replaceTag(<tagName>, [withDataAndEvents], [withDataAndEvents])
Аргументи:
- tagName: Рядок
- Назва тегу, наприклад, "div", "span" тощо.
- withDataAndEvents: булева
- "Булева інформація, яка вказує, чи слід копіювати обробники подій разом з елементами. З jQuery 1.4 також будуть скопійовані дані елементів." інформація
- deepWithDataAndEvents: булева ,
- Булева інформація, яка вказує, чи слід копіювати обробники подій та дані для всіх дітей клонованого елемента. За замовчуванням його значення відповідає значенню першого аргументу (який за замовчуванням відповідає false). " Info
Повернення:
Новостворений елемент jQuery
Гаразд, я знаю, що тут є кілька відповідей, але я взяв на себе, щоб написати це ще раз.
Тут ми можемо замінити тег так само, як ми використовуємо клонування. Ми дотримуємось того ж синтаксису, що і .clone (), що withDataAndEventsі deepWithDataAndEventsкопіює дані і події дочірніх вузлів, якщо вони використовуються.
Приклад:
$tableRow.find("td").each(function() {
$(this).clone().replaceTag("li").appendTo("ul#table-row-as-list");
});
Джерело:
$.extend({
replaceTag: function (element, tagName, withDataAndEvents, deepWithDataAndEvents) {
var newTag = $("<" + tagName + ">")[0];
// From [Stackoverflow: Copy all Attributes](http://stackoverflow.com/a/6753486/2096729)
$.each(element.attributes, function() {
newTag.setAttribute(this.name, this.value);
});
$(element).children().clone(withDataAndEvents, deepWithDataAndEvents).appendTo(newTag);
return newTag;
}
})
$.fn.extend({
replaceTag: function (tagName, withDataAndEvents, deepWithDataAndEvents) {
// Use map to reconstruct the selector with newly created elements
return this.map(function() {
return jQuery.replaceTag(this, tagName, withDataAndEvents, deepWithDataAndEvents);
})
}
})
Зауважте, що це не замінює обраний елемент, він повертає новостворений.