source

jquery를 사용하여 요소 유형을 변경하는 방법

factcode 2023. 8. 12. 10:45
반응형

jquery를 사용하여 요소 유형을 변경하는 방법

다음 코드를 가지고 있습니다.

<b class="xyzxterms" style="cursor: default; ">bryant keil bio</b>

어떻게 교체해야 합니까?b에 태그를 달다.h1태그를 지정하지만 다른 모든 속성과 정보를 유지하시겠습니까?

jQuery를 사용하여 수행할 수 있는 한 가지 방법은 다음과 같습니다.

var attrs = { };

$.each($("b")[0].attributes, function(idx, attr) {
    attrs[attr.nodeName] = attr.nodeValue;
});


$("b").replaceWith(function () {
    return $("<h1 />", attrs).append($(this).contents());
});

예: http://jsfiddle.net/yapHk/

업데이트, 플러그인:

(function($) {
    $.fn.changeElementType = function(newType) {
        var attrs = {};

        $.each(this[0].attributes, function(idx, attr) {
            attrs[attr.nodeName] = attr.nodeValue;
        });

        this.replaceWith(function() {
            return $("<" + newType + "/>", attrs).append($(this).contents());
        });
    };
})(jQuery);

예: http://jsfiddle.net/mmNNJ/

jQuery는 잘 모르겠습니다.일반 JavaScript를 사용하면 다음을 수행할 수 있습니다.

var new_element = document.createElement('h1'),
    old_attributes = element.attributes,
    new_attributes = new_element.attributes;

// copy attributes
for(var i = 0, len = old_attributes.length; i < len; i++) {
    new_attributes.setNamedItem(old_attributes.item(i).cloneNode());
}

// copy child nodes
do {
    new_element.appendChild(element.firstChild);
} 
while(element.firstChild);

// replace element
element.parentNode.replaceChild(new_element, element);

데모

하지만 이것이 얼마나 브라우저 간 호환성이 있는지는 잘 모르겠습니다.

변동은 다음과 같습니다.

for(var i = 0, len = old_attributes.length; i < len; i++) {
    new_element.setAttribute(old_attributes[i].name, old_attributes[i].value);
}

자세한 내용은 을 참조하십시오.[MDN]

@야코프와 @앤드류 휘태커

여러 요소를 한 번에 처리할 수 있도록 추가로 개선된 기능이 있습니다.

$.fn.changeElementType = function(newType) {
    var newElements = [];

    $(this).each(function() {
        var attrs = {};

        $.each(this.attributes, function(idx, attr) {
            attrs[attr.nodeName] = attr.nodeValue;
        });

        var newElement = $("<" + newType + "/>", attrs).append($(this).contents());

        $(this).replaceWith(newElement);

        newElements.push(newElement);
    });

    return $(newElements);
};

@Jazzbo의 답변은 체인이 불가능한 jQuery 개체 배열을 포함하는 jQuery 개체를 반환했습니다.각각 $.$를 반환했을 것과 더 유사한 개체를 반환하도록 변경했습니다.

    $.fn.changeElementType = function (newType) {
        var newElements,
            attrs,
            newElement;

        this.each(function () {
            attrs = {};

            $.each(this.attributes, function () {
                attrs[this.nodeName] = this.nodeValue;
            });

            newElement = $("<" + newType + "/>", attrs).append($(this).contents());

            $(this).replaceWith(newElement);

            if (!newElements) {
                newElements = newElement;
            } else {
                $.merge(newElements, newElement);
            }
        });

        return $(newElements);
    };

(또한 jslint를 전달하기 위해 코드 정리도 했습니다.)

내가 생각할 수 있는 유일한 방법은 모든 것을 수동으로 복사하는 것입니다. 예: jsfiddle

HTML

<b class="xyzxterms" style="cursor: default; ">bryant keil bio</b>

Jquery/Javascript

$(document).ready(function() {
    var me = $("b");
    var newMe = $("<h1>");
    for(var i=0; i<me[0].attributes.length; i++) {
        var myAttr = me[0].attributes[i].nodeName;
        var myAttrVal = me[0].attributes[i].nodeValue;
        newMe.attr(myAttr, myAttrVal);
    }
    newMe.html(me.html());
    me.replaceWith(newMe);
});

@앤드류 휘태커: 저는 이 변화를 제안합니다.

$.fn.changeElementType = function(newType) {
    var attrs = {};

    $.each(this[0].attributes, function(idx, attr) {
        attrs[attr.nodeName] = attr.nodeValue;
    });

    var newelement = $("<" + newType + "/>", attrs).append($(this).contents());
    this.replaceWith(newelement);
    return newelement;
};

그러면 다음과 같은 작업을 수행할 수 있습니다.$('<div>blah</div>').changeElementType('pre').addClass('myclass');

나는 @Andrew의 아이디어를 좋아합니다.Whitaker 및 기타 사용자, jQuery 플러그인 사용 - 추가changeElementType()방법.하지만 플러그인은 블랙박스와 같습니다. 코드가 어떻든 간에, 그것이 작고 잘 작동한다면...따라서 성능이 요구되며 코드보다 중요합니다.

"Pure javascript"는 jQuery보다 성능이 우수합니다.저는 @FelixKling의 코드가 @Andrew보다 더 나은 성능을 가지고 있다고 생각합니다.휘태커와 다른 사람들.


다음은 jQuery 플러그인에 캡슐화된 "순수 자바스크립트"(및 "순수 DOM") 코드입니다.

 (function($) {  // @FelixKling's code
    $.fn.changeElementType = function(newType) {
      for (var k=0;k<this.length; k++) {
       var e = this[k];
       var new_element = document.createElement(newType),
        old_attributes = e.attributes,
        new_attributes = new_element.attributes,
        child = e.firstChild;
       for(var i = 0, len = old_attributes.length; i < len; i++) {
        new_attributes.setNamedItem(old_attributes.item(i).cloneNode());
       }
       do {
        new_element.appendChild(e.firstChild);
       }
       while(e.firstChild);
       e.parentNode.replaceChild(new_element, e);
      }
      return this; // for chain... $(this)?  not working with multiple 
    }
 })(jQuery);

jquery에서 html 태그를 교체하는 방법은 다음과 같습니다.

// Iterate over each element and replace the tag while maintaining attributes
$('b.xyzxterms').each(function() {

  // Create a new element and assign it attributes from the current element
  var NewElement = $("<h1 />");
  $.each(this.attributes, function(i, attrib){
    $(NewElement).attr(attrib.name, attrib.value);
  });

  // Replace the current element with the new one and carry over the contents
  $(this).replaceWith(function () {
    return $(NewElement).append($(this).contents());
  });

});

와 함께jQuery 속성을 반복하지 않고:

replaceElem아래의 방법이 허용됩니다.old Tag,new Tag그리고.context교체를 성공적으로 실행합니다.


replaceElem('h2', 'h1', '#test');

function replaceElem(oldElem, newElem, ctx) {
  oldElems = $(oldElem, ctx);
  //
  $.each(oldElems, function(idx, el) {
    var outerHTML, newOuterHTML, regexOpeningTag, regexClosingTag, tagName;
    // create RegExp dynamically for opening and closing tags
    tagName = $(el).get(0).tagName;
    regexOpeningTag = new RegExp('^<' + tagName, 'i'); 
    regexClosingTag = new RegExp(tagName + '>$', 'i');
    // fetch the outer elem with vanilla JS,
    outerHTML = el.outerHTML;
    // start replacing opening tag
    newOuterHTML = outerHTML.replace(regexOpeningTag, '<' + newElem);
    // continue replacing closing tag
    newOuterHTML = newOuterHTML.replace(regexClosingTag, newElem + '>');
    // replace the old elem with the new elem-string
    $(el).replaceWith(newOuterHTML);
  });

}
h1 {
  color: white;
  background-color: blue;
  position: relative;
}

h1:before {
  content: 'this is h1';
  position: absolute;
  top: 0;
  left: 50%;
  font-size: 5px;
  background-color: black;
  color: yellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<div id="test">
  <h2>Foo</h2>
  <h2>Bar</h2>
</div>

행운을 빕니다...

자바스크립트 솔루션

이전 요소의 특성을 새 요소로 복사

const $oldElem = document.querySelector('.old')
const $newElem = document.createElement('div')

Array.from($oldElem.attributes).map(a => {
  $newElem.setAttribute(a.name, a.value)
})

이전 요소를 새 요소로 바꿉니다.

$oldElem.parentNode.replaceChild($newElem, $oldElem)

여기 제 버전이 있습니다.기본적으로 @fiskhandlarn 버전이지만, 새로운 jQuery 개체를 구성하는 대신 이전 요소를 새로 만든 요소로 덮어쓰므로 병합할 필요가 없습니다.
데모: http://jsfiddle.net/0qa7wL1b/

$.fn.changeElementType = function( newType ){
  var $this = this;

  this.each( function( index ){

    var atts = {};
    $.each( this.attributes, function(){
      atts[ this.name ] = this.value;
    });

    var $old = $(this);
    var $new = $('<'+ newType +'/>', atts ).append( $old.contents() );
    $old.replaceWith( $new );

    $this[ index ] = $new[0];
  });

  return this;
};

언급URL : https://stackoverflow.com/questions/8584098/how-to-change-an-element-type-using-jquery

반응형