最初の答えが私が必要とするものではないことに気づいたので、私はいくつかの変更を加えて、ここに投稿することを考えました。
改善された replaceTag(<tagName>)
replaceTag(<tagName>, [withDataAndEvents], [withDataAndEvents])
引数:
- tagName:文字列
- withDataAndEvents:ブール値
- 「イベントハンドラーを要素と共にコピーするかどうかを示すブール値。jQuery1.4以降、要素データもコピーされます。」情報
- deepWithDataAndEvents:Boolean、
- 複製された要素のすべての子のイベントハンドラーとデータをコピーするかどうかを示すブール値。デフォルトでは、その値は最初の引数の値(デフォルトはfalse)と一致します。」の情報を
戻り値:
新しく作成された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);
})
}
})
これは選択した要素を置き換えるのではなく、新しく作成された要素を返すことに注意してください。