Percebi que a primeira resposta não era exatamente o que eu precisava, então fiz algumas modificações e achei que a postaria aqui.
Melhorado replaceTag(<tagName>)
replaceTag(<tagName>, [withDataAndEvents], [withDataAndEvents])
Argumentos:
- tagName: String
- O nome da tag, por exemplo, "div", "span" etc.
- withDataAndEvents: Boolean
- "Um booleano indicando se os manipuladores de eventos devem ser copiados junto com os elementos. A partir do jQuery 1.4, os dados dos elementos também serão copiados." informação
- deepWithDataAndEvents: Boolean ,
- Um booleano indicando se os manipuladores de eventos e os dados de todos os filhos do elemento clonado devem ser copiados. Por padrão, seu valor corresponde ao valor do primeiro argumento (cujo padrão é false). " Info
Devoluções:
Um elemento jQuery recém-criado
Ok, eu sei que existem algumas respostas aqui agora, mas resolvi escrever isso novamente.
Aqui, podemos substituir a tag da mesma maneira que usamos a clonagem. Estamos seguindo a mesma sintaxe que .clone () com o withDataAndEvents
e deepWithDataAndEvents
que copiar as crianças dados e eventos nós, se usado.
Exemplo:
$tableRow.find("td").each(function() {
$(this).clone().replaceTag("li").appendTo("ul#table-row-as-list");
});
Fonte:
$.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);
})
}
})
Observe que isso não substitui o elemento selecionado, ele retorna o recém-criado.