更改 HTML 标记类型

IT技术 javascript jquery html
2021-03-11 13:16:40

我有一个问题,我可以用一个 HTML 标签替换另一个吗?

但我不想让内容空白。

从:

<a data-text="text">content</a>

到:

<div data-text="text">content</div>

任何的想法?

6个回答

2018 更新:

使用ChildNode.replaceWith()方法。如 MDN 文档中所示:

var parent = document.createElement("div");
var child = document.createElement("p");
parent.appendChild(child);
var span = document.createElement("span");

child.replaceWith(span);

console.log(parent.outerHTML);
// "<div><span></span></div>"

这个答案中有更多信息

这缺少属性转移。检查我的解决方案以获得更完整的解决方案 - stackoverflow.com/a/65090521/13817884
2021-04-23 13:16:40

不可以。您不能更改DOM 节点tagName( nodeName)。

您只能创建所需类型的新节点,复制所有属性(可能还有属性)并移动子节点。然而,您会丢失无法访问的东西,例如附加的事件侦听器。例如,当您想更改inputIE 中的 an 类型时,将使用此技术

但是,绝对没有理由将 an 更改a为 a div,它们具有完全不同的语义(还有行为和布局)。

这是解决该问题的更现代(2020+)方法。

基本上你创建一个新元素,将属性转移给它,然后转移子元素,最后用新元素替换元素。

const p = document.getElementById('foo')
const a = document.createElement('a')
for (const attr of p.attributes) {
  a.setAttribute(attr.name, attr.value)
}
a.innerHTML = p.innerHTML
p.replaceWith(a)
console.log(a.outerHTML)
<p id="foo" class="x" rel="follow">
    Some <b id="a1">bold</b> text
  </p>

当然可以,但为什么呢?

var a = ​document.getElementsByTagName('a');
var src, el, attrs;
for(var i=0,l=a.length;i<l;i++) {
    src = a[i];
    el = document.createElement('div');
    attrs = src.attributes;
    for(var j=0,k=attrs.length;j<k;j++) {
        el.setAttribute(attrs[j].name, attrs[j].value);
    }
    el.innerHTML = src.innerHTML;
    src.parentNode.replaceChild(el, src);
}
不要innerHTML用于进一步分离节点。
2021-05-06 13:16:40

这将是无效的 HTML(div元素没有href属性)并且不再像链接一样。

但是,您可以使用 JavaScript 模拟该行为:

$('div').on('click', function() {
    location.href = $(this).attr('href');
});

但请不要这样做。例如,它会中断鼠标中键(对于新选项卡)。