使用jQuery更改HTML标记?

Chr*_*per 125 jquery

这可能吗?

例:

$('a.change').click(function(){
//code to change p tag to h5 tag
});


<p>Hello!</p>
<a id="change">change</a>
Run Code Online (Sandbox Code Playgroud)

因此,单击更改锚点会导致该<p>Hello!</p>部分更改为(作为示例)h5标记,因此您将<h5>Hello!</h5>在单击后结束.我意识到你可以删除p标签并用h5替换它,但无论如何实际修改HTML标签?

mis*_*hac 202

一旦创建了dom元素,我相信标签是不可变的.你必须做这样的事情:

$(this).replaceWith($('<h5>' + this.innerHTML + '</h5>'));
Run Code Online (Sandbox Code Playgroud)

  • 这个clobber不会替换你所替换的元素上的任何属性吗?由于删除了样式属性,数据属性等,可能会导致一些意外行为...... (37认同)
  • `"<"+ el.outerHTML.replace(/(^ <\ w + |\w +> $)/ g,"H5")+">";`或者可插入的jQuery函数:[link](http:// jsfiddle达网络/ emtdkwv6/1 /) (5认同)
  • 请参阅我下面的评论...更改文档结构以应用样式并不是最好的方法。 (2认同)

Orw*_*ile 61

这是一个可以完成所有工作的扩展,在很多方面有很多元素......

用法示例:

保留现有的类和属性:

$('div#change').replaceTag('<span>', true);

要么

丢弃现有的类和属性:

$('div#change').replaceTag('<span class=newclass>', false);

甚至

用跨度,复制类和属性替换所有div,添加额外的类名

$('div').replaceTag($('<span>').addClass('wasDiv'), true);

插件来源:

$.extend({
    replaceTag: function (currentElem, newTagObj, keepProps) {
        var $currentElem = $(currentElem);
        var i, $newTag = $(newTagObj).clone();
        if (keepProps) {//{{{
            newTag = $newTag[0];
            newTag.className = currentElem.className;
            $.extend(newTag.classList, currentElem.classList);
            $.extend(newTag.attributes, currentElem.attributes);
        }//}}}
        $currentElem.wrapAll($newTag);
        $currentElem.contents().unwrap();
        // return node; (Error spotted by Frank van Luijn)
        return this; // Suggested by ColeLawrence
    }
});

$.fn.extend({
    replaceTag: function (newTagObj, keepProps) {
        // "return" suggested by ColeLawrence
        return this.each(function() {
            jQuery.replaceTag(this, newTagObj, keepProps);
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 对.而且为了记录,实际上有很多非常有效的理由可能需要更改标签.例如,如果你在SPAN中有DIV标签,那就是hella非标准.在使用princexml的严格标准进行pdb发布时,我已经从这个函数中获得了很多用处. (2认同)

jri*_*sta 12

您应该更改标记的样式(或者更确切地说,标记具有特定ID的标记),而不是更改标记的类型.更改文档元素以应用样式更改不是一个好习惯.试试这个:

$('a.change').click(function() {
    $('p#changed').css("font-weight", "bold");
});

<p id="changed">Hello!</p>
<a id="change">change</a>
Run Code Online (Sandbox Code Playgroud)

  • 即使在这种情况下,也不应该修改文档结构.如果您需要显示输入以响应单击编辑对接,则将输入放入并粘贴display:none或visibility:hidden.隐藏<h5>并显示<input>以响应按钮单击.如果你不断修改你的文档结构......你只是要求一大堆风格和布局问题. (3认同)
  • 我同意你的意见,并已将你的建议纳入项目.我将使用toggle()来显示仅在管理员登录时呈现的管理元素.虽然与原始问题无关(直接),但这可能是比我最初的方向更好的解决方案.干杯! (2认同)

Col*_*nce 8

我注意到第一个答案并不是我所需要的,所以我做了一些修改,并想到我会把它发回这里.

改进 replaceTag(<tagName>)

replaceTag(<tagName>, [withDataAndEvents], [withDataAndEvents])

参数:

  • tagName:String
    • 标签名称例如"div","span"等.
  • withDataAndEvents:Boolean
    • "一个布尔值,指示是否应该将事件处理程序与元素一起复制.从jQuery 1.4开始,元素数据也将被复制." 信息
  • deepWithDataAndEvents:Boolean,
    • 一个布尔值,指示是否应复制克隆元素的所有子项的事件处理程序和数据.默认情况下,它的值与第一个参数的值匹配(默认为false)." info

返回:

一个新创建的jQuery元素

好的,我知道现在有一些答案,但是我自己再把它写下来了.

在这里,我们可以像使用克隆一样替换标签.我们遵循同样的语法.clone()withDataAndEventsdeepWithDataAndEvents其复制,如果使用节点的数据和事件.

例:

$tableRow.find("td").each(function() {
  $(this).clone().replaceTag("li").appendTo("ul#table-row-as-list");
});
Run Code Online (Sandbox Code Playgroud)

资源:

$.extend({
    replaceTag: function (element, tagName, withDataAndEvents, deepWithDataAndEvents) {
        var newTag = $("<" + tagName + ">")[0];
        // From [Stackoverflow: Copy all Attributes](http://stackoverflow.com/a/6753486/2096729)
        $.each(element.attributes, function() {
            newTag.setAttribute(this.name, this.value);
        });
        $(element).children().clone(withDataAndEvents, deepWithDataAndEvents).appendTo(newTag);
        return newTag;
    }
})
$.fn.extend({
    replaceTag: function (tagName, withDataAndEvents, deepWithDataAndEvents) {
        // Use map to reconstruct the selector with newly created elements
        return this.map(function() {
            return jQuery.replaceTag(this, tagName, withDataAndEvents, deepWithDataAndEvents);
        })
    }
})
Run Code Online (Sandbox Code Playgroud)

请注意,这不会替换所选元素,而是返回新创建的元素.

  • 请注意,.children()将不包括任何纯文本节点。您可能想尝试`.contents()`IIRC。 (2认同)

Shu*_*ker 6

想法是包装元素并解开内容:

function renameElement($element,newElement){

    $element.wrap("<"+newElement+">");
    $newElement = $element.parent();

    //Copying Attributes
    $.each($element.prop('attributes'), function() {
        $newElement.attr(this.name,this.value);
    });

    $element.contents().unwrap();       

    return $newElement;
}
Run Code Online (Sandbox Code Playgroud)

示例用法:

renameElement($('p'),'h5');
Run Code Online (Sandbox Code Playgroud)

演示