2010-03-25 122 views
3

我有一系列的<div/>的如下:如何根据jQuery中的所有内容选择元素?

<div>.co.uk</div> 
<div>.com</div> 
<div>.gb.com</div> 
<div>.uk.com</div> 
<div>.net</div> 

如何选择只是包含.co.uk.com.net的div。

如果我使用:

$('div:contains(".co.uk"), div:contains(".com"), div:contains(".net")`) 

这将导致.gb.com.uk.com的div被以及选择。

回答

1

最好的办法是通过的div .each()遍历并通过检查$(this).text()检查回调的内容:

$('div').each(function() { 
    if ($(this).text().match(/^\.(com|net|co\.uk)$/)) { 
     // ... 
    } 
}); 
5

可以使用filter方法来检查内容:

$('div').filter(function(){ 
    var t = $(this).text(); 
    return t == '.co.uk' || t == '.com' || t == '.net'; 
}) 

您可能仍希望在选择器中删除尽可能多的元素,以减少过滤器函数必须检查的元素数量。即使contains伪类无法作出确切的匹配,它仍然可以用于减少的结果:

$('div:contains(".co.uk"), div:contains(".com"), div:contains(".net")`).filter(function(){ 
    var t = $(this).text(); 
    return t == '.co.uk' || t == '.com' || t == '.net'; 
}) 
+0

+1有趣的是,你写了与我完全相似的代码示例,包括变量名!男人,你有很好的编码风格! ;)我会删除我的回复。 – jholster 2010-03-25 13:26:15

+0

奇怪,这似乎只是返回一个div(第一场比赛)。我读了.filter()函数,这应该工作,但它不。 – Kev 2010-03-25 15:33:40

+0

@Kev:我测试了两个版本,他们确实返回了三个元素。 (第二个版本中只有一个后退标记,我必须更改为撇号以使其起作用。) – Guffa 2010-03-25 16:52:48

1

我有一个过滤器做到这一点:

jQuery.fn.pickDomains = function() { 
    var domains = jQuery.makeArray(arguments); 
    return this.filter(function(_, element) { 
    for (var d = 0; d < domains.length; ++d) 
     if (domains[d] == $(element).text()) return true; 
    return false; 
    }); 
}; 

然后你就可以只是这样说:

var theDivs = $('div.whatever').pickDomains('.co.uk', '.com', '.net'); 
相关问题