2

我有 6 个列表项

$('.favorite-tag-group li').each(function(){
  console.log("hi"); 
});

但是,此代码在控制台中显示“hi”24 次。

我能想到的唯一可能导致它出错的是因为我的列表项并不都在同一个列表中。

例如,.favorite-tag-group是一个始终包含 ul 的 div。在某些情况下,该 ul 将只有 1 li。有时它可能有 2 个。

这是一个可能看起来像的示例

div.favorite-tag-group
  ul
    li
    li
    li 
div.favorite-tag-group
  ul
    li
div.favorite-tag-group
  ul
    li
div.favorite-tag-group
  ul
    li
    li

我要做的就是运行 .each() li 以便我可以删除重复项;/

一些真正的html:

<div class="favorite-tag-group">
  <h4>gobty</h4>

  <ul class="resources led-view">
    <li class="clearfix r-tutorial" data-id="22">

    </li>
  </ul>
</div>
<div class="favorite-tag-group">
  <h4>javascript</h4>

  <ul class="resources led-view">
    <li class="clearfix r-tutorial" data-id="24">

    </li>
  </ul>
</div>
<div class="favorite-tag-group">
  <h4>macvim</h4>

  <ul class="resources led-view">
    <li class="clearfix r-tool" data-id="21">

    </li>
  </ul>
</div>  

这是真正的功能。当我将 .each() 直接粘贴到控制台时它可以工作,但在这个函数内部它不起作用:

 // collapse tags functionality
    $('.collapse-tags').click(function(e){
        e.preventDefault();
        $('.favorites-helpers, .favorite-tag-group h4').slideUp(200, function(){
            var seen = {};
            $('.favorite-tag-group li').each(function(){
                //console.log("hi");
                var currentId = $(this).data('id');
                if (seen[currentId]) {
                    $(this).slideUp(200);
                } else {
                    seen[currentId] = true;
                }
            });
        });
    });
4

2 回答 2

4

正如我上面的评论......还有一些进一步的解释。

这是因为$('.favorites-helpers, .favorite-tag-group h4')将导致多个元素slideUp(),因此回调被执行多次。移动var seen = {}到回调内部会将变量重置为每个回调中的空对象。您仍然会多次迭代您的列表项(如多个console.log()s 所见),但您li每次都会以这种方式向上滑动相同的副本。

你问:“我仍然困惑的一件事是,如果它在回调之外,为什么它看不到 see 的范围?变量范围不会说它可以看到它,因为它在函数之外?

是的,你是对的 - 回调可以看到seen,但seen从未清空/重置,因此在你的回调的第二次迭代之后,你所有的li' 都会.slideUp()调用它们。

考虑一下:因为它要么向上滑动副本,要么在第二个回调中添加idto seen.each()再次运行,但它已经充满了你的所有列表项id

希望这足够清楚,如果不只是在下面发表评论,我会尝试提出一些例子。

于 2012-08-08T04:03:40.667 回答
1

你来了,先生……

$(document).ready(function(){
    $("div.favorite-tag-group>ul").children("li").each(function(index,element){
         //code here
        //refer to element as $(element)
         //to get the id of the element use: $(element).attr("id");
      });
});​

演示:http: //jsfiddle.net/9uz8k/11/

关联:

http://api.jquery.com/each

于 2012-08-08T02:56:55.613 回答