0
4

5 回答 5

8

You need to unwrap the contents then

$('.mainmenu a:not([href])').contents().unwrap()

:not to filter out elements without an href tag

.contents() returns a jQuery object that contains the contents - which is the text

.unwrap() removes the anchor tag around it

于 2013-08-07T13:44:11.990 回答
4

纯 JavaScript

如果你想要一些基于性能的代码,试试这个。

var emptyAnchors = document.querySelectorAll('.mainmenu a:not([href])');
var content = "";

for (var a in emptyAnchors) {
    if(emptyAnchors[a].nodeType == 1)
    {
        content = document.createTextNode(emptyAnchors[a].innerHTML);
        emptyAnchors[a].parentNode.insertBefore(content, emptyAnchors[a]);
        emptyAnchors[a].parentNode.removeChild(emptyAnchors[a]);
    }
}

性能评估

现场演示


jQuery

使用 JQuery$.unwrap()方法。这将获取所选 DOMElement 的 textnode 并将其从元素中提取,然后删除空元素。

$('.mainmenu a:not([href])').each(function(){
    $(this).contents().unwrap(); /* Will delete the tag but keep its content */
});

现场演示

注意:这几乎是所选答案的替代方案,效率更高。

于 2013-08-07T13:42:27.797 回答
1
  1. 使用:notCSS3 选择器。
  2. 使用.replaceWith方法。

$('.mainmenu a:not([href])').each(function(){
    $(this).replaceWith($(this).text());
});
于 2013-08-07T13:39:11.233 回答
1

另一种解决方案是将父元素的内容替换为要删除的元素的内容$(this).replaceWith($(this).contents())

JSFiddle

于 2013-08-07T13:48:40.397 回答
-1

Try :

$('.mainmenu a:not([href])').each(function() {
    var $this = $(this);
    $this.replaceWith($this.text());
});

Might be a little quicker :

$('.mainmenu a').each(function() {
    var $this = $(this);
    $this.attr('href') || $this.replaceWith($this.text());
});
于 2013-08-07T13:44:10.917 回答