2013-03-20 62 views
0

我有一段代码,允许从这样的子节点删除文本: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

+0

究竟是你想与选择过滤掉什么? *没有*'body'是'span',所以它*不能匹配写入的任何内容。 – 2013-03-20 09:38:52

+0

@大卫托马斯我不明白......请你详细说明一下吗? – Youss 2013-03-20 09:40:24

+0

您的选择器正如所写,选择'body'标记,然后使用提供给':not()'选择器的字符串从选择中移除元素。因为'body'不是'span',所以没有元素会被删除。阅读[':not()'docs](http://api.jquery.com/not-selector/)。 – 2013-03-20 09:42:56

回答

3

您需要body:not()选择

$("body :not(span)") 

之间添加一个空格没有空间,你几乎说是给我的身体,这不是一个span元素 - 这永远是真实的,只返回身体元素。

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

更新:

我相信你看到的问题是jQuery不会选择文本节点(至少据我所知)。这SO answer建议一种方法来选择后代文本节点。

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

+0

它仍然不起作用 – Youss 2013-03-20 09:39:53

+0

控制台中的任何东西? – qwerty 2013-03-20 09:40:09

+0

不,在控制台中没有错误 – Youss 2013-03-20 09:41:16

1

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

改为尝试$(':not(span)')

+0

他甚至需要指定'body'吗?他不能只是做'$(':not(span)')'?因为无论如何,一切都会在“身体”之内。 – qwerty 2013-03-20 09:44:14

+0

@qwerty True!但在他的小提琴中,我认为他想要达到不是被“身体”之外的任何其他标签包裹的文字。所以我的选择器不适合他 – Bigood 2013-03-20 09:45:31

1

尝试......

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

+0

另一种方法是$('body')。find(':not(span)')。length; – 2013-03-20 11:51:25

0

我发现的情况下,任何人这样做的一个非常简单的方法是有兴趣的。这是在jQuery的文档就在那里,和sooooooo容易...

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

//Then do your thing 
     .remove(); 

JSfiddle example

+0

我不能相信我发现谷歌搜索两天的所有漫游者现在都是如此复杂... – Youss 2013-03-20 14:16:15