2013-03-20 63 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