2011-04-06 73 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