我注意到第一个答案并不是我所需要的,所以我做了一些修改并想把它贴回这里。
改进了replaceTag(<tagName>)
replaceTag(<tagName>, [withDataAndEvents], [withDataAndEvents])
参数:
- 标签名称:字符串
- withDataAndEvents:布尔值
- “一个布尔值,指示是否应将事件处理程序与元素一起复制。从 jQuery 1.4 开始,元素数据也将被复制。” info
- 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);
})
}
})
请注意,此不会替换所选元素,它会返回新创建的元素。