1

我有一段代码允许从子节点中删除文本,如下所示:

$.fn.removeText = function() {
    for (var i=this.length-1; i>=0; --i) removeText(this[i]);
};
function removeText(node) {
    if (!node) return;
    for (var i=node.childNodes.length-1; i>=0; --i) {
        var childNode = node.childNodes[i];
        if (childNode.nodeType === 3) node.removeChild(childNode);
        else if (childNode.nodeType === 1) removeText(childNode);
    }   
} 
$('body').removeText();

所以现在我试图排除元素,例如像这样的跨度:

$('body:not(span)').removeText();

它不起作用,一切都被删除了。我尝试了其他几个(Jquery)没有运气的东西。我必须更改removeText()功能吗?我真的很想坚持使用 Jquery .. 还有什么我可以尝试的吗?

示例 JsFiddle

4

5 回答 5

3

您需要在body:not()选择器之间添加一个空格

$("body :not(span)")

没有空间,你实际上说的是给我身体,那不是跨度元素——它总是真实的,只返回身体元素。

有了空间,你说,给我所有不是跨度元素的身体元素的孩子。

更新:

我相信您看到的问题是 jQuery 不选择文本节点(至少据我所知)。这个SO answer提出了一种选择后代文本节点的方法。

在您的小提琴中,唯一可选择的主体后代元素是跨度,您可以使用选择器选择退出该元素:not(span)

于 2013-03-20T09:39:22.840 回答
1

该选择器$('body:not(span)')意味着您想要所有body不是跨度的标签。

试试$(':not(span)')吧。

于 2013-03-20T09:42:42.570 回答
1

试试这个...

$("body").find("*").not('span').removeText();

于 2013-03-20T09:53:52.370 回答
0

最简单的方法是在所有内容周围添加一个包装器。

<div class="wrapper">

http://jsfiddle.net/btevfik/gPB6e/

于 2013-03-20T09:44:57.693 回答
0

我发现了一种非常简单的方法,以防万一有人感兴趣。它就在 Jquery 文档中,而且非常简单......

    $('body *').contents().filter(function() {
      return this.nodeType == 3;
    })

//Then do your thing
      .remove();

JSfiddle 示例

于 2013-03-20T14:15:29.303 回答