使用jQuery将类添加到一组父元素的第一个孩子

问题描述:

我已经搜索了hi和low,并且在盯着此代码库的其余部分盯了太多小时之后,对这个看似简单的函数的回答正在逃避我。使用jQuery将类添加到一组父元素的第一个孩子

HTML如下:

<a class="element-link local" data-category="local"> 
    <img src="http://placehold.it/48x48/eee/eee.png" class="logo" alt="" /> 
</a> 
<a class="element-link local" data-category="local"> 
    <img src="http://placehold.it/48x48/eee/eee.png" class="logo" alt="" /> 
</a> 
<a class="element-link news" data-category="news"> 
    <img src="http://placehold.it/48x48/eee/eee.png" class="logo" alt="" /> 
</a> 
<a class="element-link news" data-category="news"> 
    <img src="http://placehold.it/48x48/eee/eee.png" class="logo" alt="" /> 
</a> 
<a class="element-link business" data-category="business"> 
    <img src="http://placehold.it/48x48/eee/eee.png" class="logo" alt="" /> 
</a> 
<a class="element-link business" data-category="business"> 
    <img src="http://placehold.it/48x48/eee/eee.png" class="logo" alt="" /> 
</a> 
<a class="element-link business" data-category="business"> 
    <img src="http://placehold.it/48x48/eee/eee.png" class="logo" alt="" /> 
</a> 
<a class="element-link business" data-category="business"> 
    <img src="http://placehold.it/48x48/eee/eee.png" class="logo" alt="" /> 
</a> 

我试图做的是针对类别中的各一个的第一个孩子,并添加一个类到它。所以,第一条新闻,商业等(每个类别)都会增加一个类。例如,这是JS我有:

$container.find('.element-link').each(function(){ 
    var category = $(this).data('category'); 
    $(this).hasClass(category).first().addClass('new'); 
}); 

我已经试过的各种迭代:第一,:第一胎,:公式(1)没有用,我出来的咖啡引导。

任何帮助,非常感谢! 谢谢。

+1

BTW你的''缺少必需的'href'属性 – Ejaz 2013-04-30 23:44:15

+0

'hasClass'返回true/false时,不是一个可链接的对象 – Madbreaks 2013-04-30 23:45:39

+0

您可以考虑使用'.element-link'的'background-image'代替在每一个嵌入图像 – Madbreaks 2013-04-30 23:49:10

hasClass返回truefalse,所以你不能链接它进一步与.first()

这么说,你应该缓存所有的链接,然后进行筛选:

var $links = $container.find('.element-link'); 

$links.each(function(){ 
    var category = $(this).data('category'); 
    $links.find('.' + category).first().addClass('new'); 
}); 

也许我的代码是不是很好,但应该工作。

var oldCategory = ''; 
$container.find('.element-link').each(function(){ 
    var category = $(this).data('category'); 
    if(oldCategory != category) 
     $(category).addClass('new'); 
    oldCategory = category; 
}); 
+0

-1太脆。虽然这可能适用于给定的代码示例,但它假定类别始终分组,并且如果有任何重叠将会失败。此外,它效率低下,循环所有'元素链接'元素 – Madbreaks 2013-04-30 23:51:17

+0

但在这种情况下,它会工作。我用这个指定的html代码回答这个问题。你有评论的权利,但不应该减去我。 – WooCaSh 2013-04-30 23:56:11

这是实现的另一种方式,它

 //get all unique "category" values 
     var cats = $.unique($('a.element-link').map(function(){ 
      return $(this).data('category') 
     }).get()); 

     //add classes to first element of each "category" 
     for (var x =0; x < cats.length; x++){ 
      $('a.element-link[data-category="'+cats[x]+'"]:first').addClass('new'); 
     } 
+0

+1你也打败了我吧。我想要一个'for(var i in cats)'比'for'循环的标准更好,但是,嘿,那只是我。我认为这是一种优越的方法,因为它不需要迭代所有'.element-link'元素。 – Madbreaks 2013-04-30 23:57:31

+0

谢谢。通过缓存'$('a.element-link')';还有一些优化空间;) – Ejaz 2013-05-01 00:14:54