jQuery를 사용하여 한 태그를 다른 태그로 바꾸기


101

골:

jQuery를 사용하여 다음 항목을 모두 바꾸려고합니다.

<code> ... </code>

와:

<pre> ... </pre>

내 솔루션 :

나는 다음과 같은 것을 얻었습니다.

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

내 솔루션의 문제 :

그러나 문제는 (두 번째, 세 번째, 네 번째 등) "code"태그 사이의 모든 것을 첫 번째 "code"태그 사이의 콘텐츠로 대체한다는 것 입니다.

예 :

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

된다

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

나는 "this"와 어떤 종류의 기능을 사용해야한다고 생각하지만, 나는 아직도 배우고 있고, 해결책을 모으는 방법을 정말로 이해하지 못하는 것이 두렵다.


랩 - 포장을 벗긴 솔루션을 고정 이제 존은 - 그것을 체크 아웃)
옌스 롤랜드에게

답변:


157

.replaceWith [문서]에 함수를 전달할 수 있습니다 .

$('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

@jon :하지만 Jens의 솔루션을 다시 확인하고 수정했습니다.
Felix Kling

1
멋진 트릭을 위해 +1-단순한 태그 대 태그 대체 이상의 용도로 사용할 수 있습니다.
Jens Roland

@FelixKling 이것이 코드 태그의 속성을 덮어 쓰지 않습니까?
tewathia

80

이것은 훨씬 더 좋습니다.

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

물론 Felix Kling의 솔루션 은 약 2 배 빠릅니다 .


4
제 눈에는 이것이 가장 효율적인 해결책 인 것 같습니다. :)
jon

아하. 그래, 너희들이 옳았다. 나에게도 효과가 없었습니다. 잡아 주셔서 감사합니다!
jon

1
FWIW $('code').children()code요소에 자식 요소 노드가 없기 때문에 위의 예에서 빈 jQuery 개체를 반환합니다 . 자식 요소가 있으면 작동하지만 .
Felix Kling 2011 년

1
Fixed-true, 콘텐츠가 단일 텍스트 노드로 구성된 children()경우 작동하지 않습니다. contents()대신 사용하면 완벽하게 작동합니다. jsfiddle.net/7Yne9
옌스 롤랜드

1
다음은 페이지를 깨지 않는 jsperf 버전입니다. jsperf.com/substituting-one-tag-for-another-with-jquery/2 그리고 속도 차이가 더 이상 크지 않다는 것을 알 수 있습니다. 요소 당 두 개의 DOM 조작을 수행하기 때문에 솔루션이 느려집니다 unwrap. 부모를 제거하고 자식을 트리에 wrap추가하고 다시 분리하고 새 부모를 추가합니다.
Felix Kling

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 초 이내에 똑같은 해결책을 내놓았다. 약간의 서식 차이가 있습니다. 어느 쪽을 찬성할지 모르겠습니다. 토마스의 대답에서 함수와 () 사이의 공백이 정말 마음에 들지 않으며 kokos 대답의 두 줄의 빈 공간은 꽤 요점 + () 사이에 공백이 있어야합니다 와 {
마이클 Bylstra

11

이건 어때요?

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

6

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안에 있는 태그 도 대체 합니다.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
지금까지 최고의 답변입니다. 다른 사람들은 사람들이 그들을 찬성하는 것이 정말 이상합니다. 속성에 대해 생각한 유일한 사람이 된 것을 축하합니다.
Guilherme David da Costa


2

바닐라 자바 ​​스크립트를 사용했다면 다음과 같이 할 수 있습니다.

  • 새 요소 만들기
  • 이전 요소의 자식을 새 요소로 이동
  • 이전 요소 앞에 새 요소 삽입
  • 이전 요소 제거

다음은이 프로세스에 해당하는 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 기능을 사용할 수 있습니다. 다음은 코드의 모든 속성을 유지하면서 코드 태그를 사전 태그로 대체하는 샘플입니다.

    $('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 )
patrick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.