jQueryを使用して1つのタグを別のタグに置き換える


100

ゴール:

jQueryを使用して、次のすべての出現箇所を置き換えようとしています。

<code> ... </code>

と:

<pre> ... </pre>

私の解決策:

私は次のところまで行きました、

$('code').replaceWith( "<pre>" + $('code').html() + "</pre>" );

私の解決策の問題:

しかし、問題は、(2番目、3番目、4番目など)「コード」タグ間のすべてを最初の「コード」タグ間のコンテンツで置き換えることです。

例えば

<code> A </code>
<code> B </code>
<code> C </code>

なる

<pre> A </pre>
<pre> A </pre>
<pre> A </pre>

「これ」とある種の関数を使用する必要があると思いますが、私はまだ学んでいるのではないかと思い、ソリューションを組み合わせる方法を本当に理解していません。


ラップ・アンラップ・ソリューションが修正されたjon-チェックしてみてください;)
イェンス・ローランド

回答:


157

.replaceWith [docs]に関数を渡すことができます:

$('code').replaceWith(function(){
    return $("<pre />", {html: $(this).html()});
});

関数内で、this現在処理されているcode要素を参照します。

デモ

更新:大きなパフォーマンスの違いはありませんが、code要素に他のHTMLの子がある場合、シリアライズする代わりに子を追加すると、より正確に感じられます。

$('code').replaceWith(function(){
    return $("<pre />").append($(this).contents());
});

1
これは最もエレガントなソリューションのようですが、replaceWith関数の内部で何が起こっているのか理解できないことを認めます。もっと聞きたいです。つまり、開始タグと終了タグをどのように割り当てますか?<pre />のスペースはそれを達成しますか?
jon

2
@jon:新しい要素を作成するための簡単な方法です。詳細については、api.jquery.com / jQuery / #jQuery2を参照してください。jQueryはすべての要素をループし、それぞれの関数を実行します(同じこと.eachを行います)。
Felix Kling、2011

@jon:しかし、Jensの解決策をもう一度確認してください。
Felix Kling

1
+1を使用すると、単純なタグごとの置換だけでなく、さまざまな用途に使用できます。
Jens Roland

@FelixKlingこれはコードタグの属性を上書きしませんか?
テワシア2013

80

これはずっといいです:

$('code').contents().unwrap().wrap('<pre/>');

確かにFelix Klingのソリューションは約2倍高速です


4
魅力のように機能しました。私の目には、これが最も効率的なソリューションのようです。:)
JON

ああ。うん、君たちは正しかった。それも私にはうまくいきませんでした。それをキャッチしてくれてありがとう!
JON

1
FWIWは$('code').children()code要素に子要素ノードがないため、上記の例では空のjQueryオブジェクトを返します。子要素があれば動作しますが。
Felix Kling、2011

1
修正済み-true、コンテンツが単一のテキストノードで構成されている場合、機能しchildren()ません。contents()代わりに使用すると完全に動作します。jsfiddle.net/7Yne9
イェンスローランド

1
これはページを壊さないjsperfバージョンです:jsperf.com/substituting-one-tag-for-another-with-jquery/2と速度差はもうそれほど大きくないことがわかります。要素ごとに2つのDOM操作を実行するため、ソリューションは遅くなります。unwrap親を削除して子をツリーにwrap追加し、それらを再度切り離して、新しい親を追加します。
Felix Kling、2011

26

はいつでも最初の要素を参照するため、常に最初の要素codeのコンテンツを取得するのは正しいことです$('code').html()

代わりに、を使用.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.
});

12

これを試して:

$('code').each(function(){

    $(this).replaceWith( "<pre>" + $(this).html() + "</pre>" );

});

http://jsfiddle.net/mTGhV/


ワオ。君たちはお互いの2秒以内にまったく同じ解決策を思いついた。わずかなフォーマットの違いがあります。どちらを投票するかわかりません-トーマスの答えのfunctionと()の間のスペースは本当に好きではありません。kokosの答えの2行の空のスペースはかなりポイントです+()の間にスペースが必要ですと{
Michael Bylstra、2013

11

これはどう?

$('code').each(function () {
    $(this).replaceWith( "<pre>" + $(this).html() + "</pre>" );
});

6

フェリックスの答えに基づいて構築します。

$('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内側にあるタグも置き換えられます。innerHTMLcode

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');

2
これまでのベストアンサー。他のものはほとんど同じで、人々がそれらに賛成するのは本当に奇妙です。属性について考えた唯一の存在であることを祝福します。
ギルヘルメデビッドダコスタ


2

バニラ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ある破壊的



0
$('code').each(function(){
    $(this).replaceWith( "<pre>" + $(this).html()  + "</pre>" );
    });

最良かつクリーンな方法。


0

jQueryのhtml関数を使用できます。以下は、コードのすべての属性を保持しながら、コードタグをpreタグに置き換えるサンプルです。

    $('code').each(function() {
        var temp=$(this).html();
        temp=temp.replace("code","pre");
        $(this).html(temp);
    });

これは、前のタグのすべての属性を保持しながら、交換する必要があるhtml要素タグのセットで機能します。


0

メイド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')

0

ここで示されるすべての回答は、(質問の例が示すように)タグに属性がないことを前提としています。受け入れられた回答がこれで実行された場合:

<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 );
} );

私はこれが数年前のものであることを知っていますが、私が言及したいと思っただけです...あなたは前の要素のhtmlを保持するのを忘れていました。コードスニペットでは、子をコピーすることなく、属性を持つ新しい要素を作成するだけです。
友人

それを追加することによって行われますcontent.html( this.html )
パトリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.