jQuery:如何更改标签名称?

时间:2010-08-08 20:03:15

标签: javascript jquery html dom dhtml

jQuery:如何更改标签名称?

例如:

<tr>
    $1
</tr>

我需要

<div>
    $1
</div>

是的,我可以

  1. 创建DOM元素&lt; div&gt;
  2. 将tr内容复制到div
  3. 从dom中删除tr
  4. 但我可以直接制作吗?

    PS:

        $(tr).get(0).tagName = "div"; 
    

    结果为DOMException

17 个答案:

答案 0 :(得分:43)

不,根据W3C规范是不可能的:“DOMString类型的tagName,readonly”

http://www.w3.org/TR/DOM-Level-2-Core/core.html

答案 1 :(得分:35)

您可以使用jQuery的.replaceWith()方法替换任何HTML标记。

示例:http://jsfiddle.net/JHmaV/

参考:。replaceWith

如果要保留现有标记,可以使用以下代码:

$('#target').replaceWith('<newTag>' + $('target').html() +'</newTag>')

答案 2 :(得分:13)

DOM renameNode()方法在哪里?

今天(2014年),没有浏览器了解new DOM3 renameNode method(请参阅also W3C) 检查是否在你的保龄球运行:http://jsfiddle.net/k2jSm/1/

所以,DOM解决方案很难看,我不明白为什么(?)jQuery没有实现变通方法?

纯DOM算法

  1. createElement(new_name)
  2. 将所有内容复制到新元素;
  3. replaceChild()
  4. 将旧版本替换为新版本

    是这样的,

    function rename_element(node,name) {
        var renamed = document.createElement(name); 
        foreach (node.attributes as a) {
            renamed.setAttribute(a.nodeName, a.nodeValue);
        }
        while (node.firstChild) {
            renamed.appendChild(node.firstChild);
        }
        return node.parentNode.replaceChild(renamed, node);
    }
    

    ...等待审核和jsfiddle ......

    jQuery算法

    @ilpoldo算法是一个很好的起点,

       $from.replaceWith($('<'+newname+'/>').html($from.html()));
    

    正如其他人评论的那样,它需要一个属性副本......等待通用......

    特定于class保留属性,请参阅http://jsfiddle.net/cDgpS/

    另见https://stackoverflow.com/a/9468280/287948

答案 3 :(得分:9)

上述解决方案消除了现有元素并从头开始重新创建,破坏了过程中对子节点的任何事件绑定。

简短回答:(失去属性)

$("p").wrapInner("<div/>").children(0).unwrap();

更长的回答:(副本的属性)

$("p").each(function (o, elt) {
  var newElt = $("<div class='p'/>");
  Array.prototype.slice.call(elt.attributes).forEach(function(a) {
    newElt.attr(a.name, a.value);
  });
  $(elt).wrapInner(newElt).children(0).unwrap();
});

fiddle with nested bindings

同时复制任何绑定会很酷,但getting current bindings对我不起作用。

答案 4 :(得分:7)

要保留代码的内部内容,您可以将访问者.html().replaceWith()

结合使用

分叉示例:http://jsfiddle.net/WVb2Q/1/

答案 5 :(得分:2)

你可以有点基础。适合我。

var oNode = document.getElementsByTagName('tr')[0];

var inHTML = oNode.innerHTML;
oNode.innerHTML = '';
var outHTML = oNode.outerHTML;
outHTML = outHTML.replace(/tr/g, 'div');
oNode.outerHTML = outHTML;
oNode.innerHTML = inHTML;

答案 6 :(得分:1)

要替换多个标记的内部内容,每个标记都有自己的原始内容,您必须以不同的方式使用.replaceWith().html()

http://jsfiddle.net/kcrca/VYxxG/

答案 7 :(得分:1)

ericP答案的启发,格式化并转换为jQuery插件:

$.fn.replaceWithTag = function(tagName) {
    var result = [];
    this.each(function() {
        var newElem = $('<' + tagName + '>').get(0);
        for (var i = 0; i < this.attributes.length; i++) {
            newElem.setAttribute(
                this.attributes[i].name, this.attributes[i].value
            );
        }
        newElem = $(this).wrapInner(newElem).children(0).unwrap().get(0);
        result.push(newElem);
    });
    return $(result);
};

用法:

$('div').replaceWithTag('span')

答案 8 :(得分:1)

JS更改标记名称

/**
 * This function replaces the DOM elements's tag name with you desire
 * Example:
 *        replaceElem('header','ram');
 *        replaceElem('div.header-one','ram');
 */
function replaceElem(targetId, replaceWith){
  $(targetId).each(function(){
    var attributes = concatHashToString(this.attributes);
    var replacingStartTag = '<' + replaceWith + attributes +'>';
    var replacingEndTag = '</' + replaceWith + '>';
    $(this).replaceWith(replacingStartTag + $(this).html() + replacingEndTag);
  });
}
replaceElem('div','span');

/**
 * This function concats the attributes of old elements
 */
function concatHashToString(hash){
  var emptyStr = '';
  $.each(hash, function(index){
    emptyStr += ' ' + hash[index].name + '="' + hash[index].value + '"';
  });
  return emptyStr;
}

相关小提琴就在这个link

答案 9 :(得分:0)

也试试这个。在这个例子中,我们也可以在新标签中拥有旧标签的属性

var newName = document.querySelector('.test').outerHTML.replaceAll('h1', 'h2');
document.querySelector('.test').outerHTML = newName;
<h1 class="test">Replace H1 to H2</h1>

答案 10 :(得分:0)

工作纯DOM算法

function rename_element(node, name) {
    let renamed = document.createElement(name);

    Array.from(node.attributes).forEach(attr => {
        renamed.setAttribute(attr.name, attr.value);        
    })
    while (node.firstChild) {
        renamed.appendChild(node.firstChild);
    }
    node.parentNode.replaceChild(renamed, node);
    return renamed;
}

答案 11 :(得分:0)

您可以使用此功能

var renameTag  = function renameTag($obj, new_tag) {
    var obj = $obj.get(0);
    var tag = obj.tagName.toLowerCase();
    var tag_start = new RegExp('^<' + tag);
    var tag_end = new RegExp('<\\/' + tag + '>$');
    var new_html = obj.outerHTML.replace(tag_start, "<" + new_tag).replace(tag_end, '</' + new_tag + '>');
    $obj.replaceWith(new_html);
};

ES6

const renameTag = function ($obj, new_tag) {
    let obj = $obj.get(0);
    let tag = obj.tagName.toLowerCase();
    let tag_start = new RegExp('^<' + tag);
    let tag_end = new RegExp('<\\/' + tag + '>$');
    let new_html = obj.outerHTML.replace(tag_start, "<" + new_tag).replace(tag_end, '</' + new_tag + '>');
    $obj.replaceWith(new_html);
};

示例代码

renameTag($(tr),'div');

答案 12 :(得分:0)

另一个更改节点名称的脚本

function switchElement() {
  $element.each(function (index, oldElement) {
    let $newElement = $('<' + nodeName + '/>');
    _.each($element[0].attributes, function(attribute) {
      $newElement.attr(attribute.name, attribute.value);
    });
    $element.wrapInner($newElement).children().first().unwrap();
  });
}

http://jsfiddle.net/rc296owo/5/

它会将属性和内部html复制到一个新元素中,然后替换旧元素。

答案 13 :(得分:0)

Jquery插件制作&#34; tagName&#34;可编辑:

(function($){
    var $newTag = null;
    $.fn.tagName = function(newTag){
        this.each(function(i, el){
            var $el = $(el);
            $newTag = $("<" + newTag + ">");

            // attributes
            $.each(el.attributes, function(i, attribute){
                $newTag.attr(attribute.nodeName, attribute.nodeValue);
            });
            // content
            $newTag.html($el.html());

            $el.replaceWith($newTag);
        });
        return $newTag;
    };
})(jQuery);

请参阅:http://jsfiddle.net/03gcnx9v/3/

答案 14 :(得分:0)

带上他

这个词

用Word解答问题“如何更改标签名称?”我建议这个解决方案:
如果有意义或必须逐案决定。

我的示例将“重命名”所有带有span标签的带有超链接的标签。维护所有属性和内容:

$('a[href^="sms:"]').each(function(){
  var $t=$(this);
  var $new=$($t.wrap('<div>')
    .parent()
        .html()
        .replace(/^\s*<\s*a/g,'<span')
        .replace(/a\s*>\s*$/g,'span>')
        ).attr('href', null);
  $t.unwrap().replaceWith($new);
});

由于具有href属性的span标记没有任何意义,我也删除它。 这样做是防弹的,并且与jquery支持的所有浏览器兼容。 人们尝试将所有属性复制到新元素还有其他方法,但这些方法与所有浏览器都不兼容。

虽然我认为以这种方式做这件事非常昂贵。

答案 15 :(得分:0)

由于replaceWith()在元素基础上对我不起作用(可能是因为我在map()中使用它),我通过创建一个新元素并根据需要复制属性来实现它。 p>

$items = $('select option').map(function(){

  var
    $source = $(this),
    $copy = $('<li></li>'),
    title = $source.text().replace( /this/, 'that' );

  $copy
    .data( 'additional_info' , $source.val() )
    .text(title);

  return $copy;
});

$('ul').append($items);

答案 16 :(得分:0)

简单地更改属性值将不会这样做(正如其他人所说的,一些HTMLElement属性是只读的;还有一些属性将原型上下文保存到更原始的元素)。模仿DOM API最接近的是模仿JavaScript中的原型继承过程。

通过__proto__对对象的原型进行“设置”通常是不受欢迎的。此外,您可能会考虑为什么您认为首先需要复制整个DOM元素。但是这里有:

// Define this at whatever scope you'll need to access it
// Most of these kinds of constructors are attached to the `window` object

window.HTMLBookElement = function() {

  function HTMLBookElement() {
    var book = document.createElement('book');
    book.__proto__ = document.createElement('audio');
    return book;
  }

  return new HTMLBookElement();

}

// Test your new element in a console (I'm assuming you have Chrome)

var harryPotter = new HTMLBookElement();

// You should have access to your new `HTMLBookElement` API as well as that
// of its prototype chain; since I prototyped `HTMLAudioElement`, you have 
// some default properties like `volume` and `preload`:

console.log(harryPotter);         // should log "<book></book>"
console.log(harryPotter.volume);  // should log "1"
console.log(harryPotter.preload); // should log "auto"

所有DOM元素都以这种方式工作。例如: <div></div>HTMLDivElement生成, 扩展HTMLElement, 反过来扩展Element, 反过来扩展Object