Jquery:not()选择器不工作

时间:2013-03-20 09:36:52

标签: javascript jquery

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

$.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 ..还有什么我可以尝试的吗?

Example JsFiddle

5 个答案:

答案 0 :(得分:3)

您需要在body:not()选择器

之间添加空格
$("body :not(span)")

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

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

<强>更新

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

在你的小提琴中,唯一可以选择的身体后代元素是跨度,你可以选择退出该元素与你的:not(span)选择器。

答案 1 :(得分:1)

该选择器$('body:not(span)')表示您希望所有body代码都不跨越。

请尝试$(':not(span)')

答案 2 :(得分:1)

试试这个......

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

答案 3 :(得分:0)

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

<div class="wrapper">

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

答案 4 :(得分:0)

我找到了一个非常简单的方法,以防万一有人感兴趣。它就在Jquery文档中,而且太容易了......

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

//Then do your thing
      .remove();

JSfiddle example