如何jQuery选择页面上未包含在某个div中的所有链接

时间:2011-09-26 17:55:09

标签: jquery arrays selector inverse

假设我在页面上有产品链接,某些产品在推荐div中:

<a href="some_url?pid=abc"><img src ... ></a>
<a href="some_url?pid=abc">ABC Product Name...</a>

<a href="some_url?pid=def">
 .... more product links

<div class="recommendations">
  <a href="some_url?pid=uvw"> ...
  <a href="some_url?pid=xyz"> ...
</div>

我需要为推荐和非推荐的网址构建唯一的pid列表,如下所示:

 recommended_pids = ["uvw","xyz"];
 non_recommened_pids = ["abc","def"];

我知道我可以在这样的页面上git列出所有pid:

 $('a[href*="pid="]').each(function() {
   //get just the pid part
   var link = this.href;
   var pid = link.split('pid=')[1].split('&')[0];
   pids.push(pid);
 });

我可以使用这样的选择器在页面上获取推荐的pid列表:

$('div.recommended a[href*="pid="]')

对每个数组进行排序和uniq,然后减去所有元素,然后进行数组减法,得到非推荐的pid列表。

但有没有办法使用其他jQuery过滤器来获取未包含在推荐div中的pid列表而无需编写数组减法函数?

3 个答案:

答案 0 :(得分:2)

嗯,总是.filter()

var $pidLinks = $('a[href*="pid="]');
// recommended links
$pidLinks.filter('div.recommendations > a');
// non-recommended links
$pidLinks.filter(':not(div.recommendations > a)');

Somewhat gratuitous jsFiddle

对于它的价值,@ Jayendra的解决方案更简单,可能更好,除非你需要获得两个列表 - 在这种情况下我相信使用.filter()应该有更好的性能如果你缓存所有链接的原始选择。

答案 1 :(得分:2)

请勿使用

$("a:not(.recommendations a)").each(function(index){
    alert(this.id);
});

答案 2 :(得分:1)

在每个功能中,你可以这样做:

if( $(this).parents(".recommendations").length ) {

    recommended_pids.push(pid);

} else {

    non_recommened_pids.push(pid);

}