JQueryを使用して、私はすべての出現を置き換えようとしています:
<code> ... </code>
で:
<pre> ... </pre>
私は次のようになりました、
$('code').replaceWith( "<pre>" + $('code').html() + "</pre>" );
ただし、問題は、(2番目、3番目、4番目など)「code」タグの間のすべてをfirst "code"タグの間のコンテンツに置き換えることです。
例えば.
<code> A </code>
<code> B </code>
<code> C </code>
になる
<pre> A </pre>
<pre> A </pre>
<pre> A </pre>
「これ」とある種の機能を使用する必要があると思いますが、私はまだ学習中であり、ソリューションをつなぎ合わせる方法を本当に理解していないと思います。
関数を .replaceWith
に渡すことができます[ドキュメント] :
$('code').replaceWith(function(){
return $("<pre />", {html: $(this).html()});
});
関数内で、this
は現在処理されているcode
要素を参照します。
更新:大きなパフォーマンスの違いはありません がありますが、code
要素に他のHTML子がある場合、子を直列化する代わりに追加する方がより正確に感じます:
$('code').replaceWith(function(){
return $("<pre />").append($(this).contents());
});
$('code').html()
は常に最初の要素を参照するため、最初のcode
のコンテンツを常に取得するのは正しいことです。
代わりに、 .each
すべての要素を反復処理し、各要素を個別に変更します。
$('code').each(function() {
$(this).replaceWith( "<pre>" + $(this).html() + "</pre>" );
// this function is executed for all 'code' elements, and
// 'this' refers to one element from the set of all 'code'
// elements each time it is called.
});
これを試して:
$('code').each(function(){
$(this).replaceWith( "<pre>" + $(this).html() + "</pre>" );
});
これはどう?
$('code').each(function () {
$(this).replaceWith( "<pre>" + $(this).html() + "</pre>" );
});
Felixの答えに基づいて構築します。
$('code').replaceWith(function() {
var replacement = $('<pre>').html($(this).html());
for (var i = 0; i < this.attributes.length; i++) {
replacement.attr(this.attributes[i].name, this.attributes[i].value);
}
return replacement;
});
これにより、code
タグの属性が置換pre
タグに再現されます。
編集:これは、他のcode
タグのinnerHTML
内にあるcode
タグでも置き換えます。
function replace(thisWith, that) {
$(thisWith).replaceWith(function() {
var replacement = $('<' + that + '>').html($(this).html());
for (var i = 0; i < this.attributes.length; i++) {
replacement.attr(this.attributes[i].name, this.attributes[i].value);
}
return replacement;
});
if ($(thisWith).length>0) {
replace(thisWith, that);
}
}
replace('code','pre');
JQuery 1.4.2以降:
$('code').replaceWith(function(i,html) {
return $('<pre />').html(html);
});
その後、新しい要素を選択できます。
$('pre').css('color','red');
ソース: http://api.jquery.com/replaceWith/#comment-45493689
jsFiddle: http://jsfiddle.net/k2swf/16/
Vanilla JavaScriptを使用している場合:
このプロセスに相当するjQueryは次のとおりです。
_$("code").each(function () {
$("<pre></pre>").append(this.childNodes).insertBefore(this);
$(this).remove();
});
_
Jsperf URLは次のとおりです。
http://jsperf.com/substituting-one-tag-for-another-with-jquery/7
PS:.html()
または_.innerHTML
_を使用するすべてのソリューションは、destructive。
別の短く簡単な方法:
$('code').wrapInner('<pre />').contents();
JQueryのhtml関数を使用できます。以下は、コードのすべての属性を保持しながら、コードタグをpreタグに置き換えるサンプルです。
$('code').each(function() {
var temp=$(this).html();
temp=temp.replace("code","pre");
$(this).html(temp);
});
これは、前のタグのすべての属性を保持しながら、交換する必要があるhtml要素タグのセットで機能します。
$('code').each(function(){
$(this).replaceWith( "<pre>" + $(this).html() + "</pre>" );
});
最良かつクリーンな方法。
ここで与えられるすべての回答は、(質問の例が示すように)タグに属性がないことを前提としています。受け入れられた答えがこれで実行される場合:
<code class='cls'>A</code>
に置き換えられる場合
<pre>A</pre>
属性も保持したい場合はどうしますか。タグを置き換えるとはどういうことですか?これが解決策です。
$("code").each( function(){
var content = $( "<pre>" );
$.each( this.attributes, function(){
content.attr( this.name, this.value );
} );
$( this ).replaceWith( content );
} );
jquery
プラグインを作成し、属性も維持します。
$.fn.renameTag = function(replaceWithTag){
this.each(function(){
var outerHtml = this.outerHTML;
var tagName = $(this).prop("tagName");
var regexStart = new RegExp("^<"+tagName,"i");
var regexEnd = new RegExp("</"+tagName+">$","i")
outerHtml = outerHtml.replace(regexStart,"<"+replaceWithTag)
outerHtml = outerHtml.replace(regexEnd,"</"+replaceWithTag+">");
$(this).replaceWith(outerHtml);
});
return this;
}
使用法:
$('code').renameTag('pre')