2011-04-06 269 views
3

我有一個表,其中包含逗號分隔的數字列表如下:<td>72,76,81</td>。我試圖選擇不包含包含特定數字的表格單元格。這個選擇的工作:jQuery:包含html

$("td:not(:contains('76'))", $table)

的問題是,有可能是含有「576」的行或「761」等

爲了解決這個問題,我決定把周圍每個<span>號碼,現在是:<td><span>72</span>,<span>76</span>,<span>81</span></td>。我的選擇是現在:

$("td:not(:contains('<span>76</span>'))", $table)

當我調試此選擇在Firebug,它正在恢復,而不是正確<td> s表示實際上並不存在於HTML源代碼一些跨度標籤。

基本上,將'<span>'放入:contains()字符串中會破壞選擇器。有沒有類似於:contains()的選擇器可以在HTML傳遞給它時正常工作?或者有什麼方法可以選擇<span>內的整個字符串?

順便說一句,這個網站是使用jQuery 1.3.2。

+1

使用未可怕出過期版本的jQuery的沒有機會? – 2011-04-06 18:47:48

+0

有一天..它會打破幾個圖書館,我還沒有能夠說服客戶他們應該花錢升級。 – jessica 2011-04-06 19:12:19

回答

5

如果你想堅持<span> S,這樣的作品,甚至使用jQuery 1.3.2:

var $tds = $("table td").filter(function() { 
    return !$(this).find('span').filter(function() { 
     return $(this).text() === '76'; 
    }).length; 
}); 

http://jsfiddle.net/mattball/PFk8H/


在另一方面,如果你想回去,這實際上很容易舊的標記:

var $tds = $("table td").filter(function() { 
    return !$(this).text().match(/\b76\b/); 
}); 

http://jsfiddle.net/mattball/L6AFz/


要在正則表達式中使用變量,使用new RegExp(string) constructor syntax

var n = 76, 
    re = new RegExp("\\b" + n + "\\b"); 

var $tds = $("table td").filter(function() { 
    return !$(this).text().match(re); 
}); 

http://jsfiddle.net/mattball/hKQH7/

+2

請簡化正則表達式像這樣匹配(/ \ b76 \ b /)'意思是任意一邊的字邊界76 – 2011-04-06 19:15:38

+0

完成。謝謝,我覺得自己不是那麼想的白癡。 – 2011-04-06 19:24:46

+0

選項2在這裏看起來是最好的答案,因爲它減少了DOM元素的數量。 :)雖然問題,我想通過一個變量傳遞給match()語句(顯然我並不總是在尋找數字76)。 '$(this).text()。match('\ b'+ val +'\ b')''正在返回undefined對我來說..任何想法爲什麼?順便說一句我用這個答案把我的正則表達式的變量 - 似乎並沒有工作http://stackoverflow.com/questions/1695633/how-to-pass-a-variable-into-regex-in-jquery -javascript/1695653#1695653 – jessica 2011-04-06 19:49:13

2

試試這個:

$( 「TD跨度:沒有(:含有('76' ))」,$表).parent()

$("td span", $table).filter(function(){return $(this).text() != '76';}).parent() 
+4

難道這不符合'576'或'761'? – jessica 2011-04-06 18:43:37

+0

是的,我會找到另一種方式... – manji 2011-04-06 18:54:00

+0

這完全有效,謝謝。如果可以的話,我傾向於使用不需要span標籤的答案。 :)如果沒有,那麼我會接受你的。 – jessica 2011-04-06 19:53:23

0

我會用一個正則表達式來匹配表格行的內部。在所有的元素首先迭代則忽略匹配正則表達式

這裏說的那些是基本的,將匹配:

/^76$/g 

退房RegExr建立更多的正則表達式。

+0

我認爲這也會匹配其他包含'76'的數字..? – jessica 2011-04-06 19:17:59

+0

@jessica:那個正則表達式不起作用_at all_ – 2011-04-06 19:26:53

+0

我想念讀數據的地方。但是,如果您匹配表格行的值,它會起作用。 – babsher 2011-04-06 19:29:42

0

爲了避免 '包含' 的問題,你會令他們如類:

<span class="76"></span> 

和:

$("td:not(:has(span.76)"), $table) 

這可能被調整爲具有在1個對象倍數也爲:

<span class="76 77 78"></span> 

甚至放入TD本身甚至更簡化了選擇器

$("td:not(.76 .77, $table) 
+0

這仍然會匹配'576'和'761'。 – 2011-04-06 18:47:08

+0

已修復此問題 – MacAnthony 2011-04-06 18:49:33

+0

不幸的是,我無法將值轉換爲類,因爲表中的所有單元格都是由相同的PHP循環輸出的,而且某些單元格包含的產品名稱可能很長,包含引號, etc. – jessica 2011-04-06 18:55:20

1

爲此,您可能無法使用:contains。正如你所說:contains('76')將匹配'76','576','761'等。你可以嘗試使用.filter來得到你想要的。

$('td:has("span")').filter(function(){ 
    var x = true; 
    $('span', this).each(function(){ 
     x = x && $(this).text() != '76'; 
    }); 
    return x; 
}); 

演示:http://jsfiddle.net/KvK3J/

1

測試使用jQuery 1.2.6

http://jsfiddle.net/G27JF/4/

 

$("td>span").filter(function() { 
    return ($(this).text() != 76); 
}).parent().css("text-decoration", "underline"); 
 
+0

您是否意識到使用'%76'意味着它會接受76的倍數? – 2011-04-06 19:05:53

+0

@matt - 不錯的obs。解決了。 – danidacar 2011-04-06 19:07:56

+1

...再次,這與@ Rocket的答案有同樣的問題。你現在選擇跨度,而不是tds。 – 2011-04-06 19:08:42