【问题标题】:jQuery - Iterate only once in a nested each loopjQuery - 在嵌套的每个循环中仅迭代一次
【发布时间】:2014-06-18 00:08:09
【问题描述】:

我一直在尝试仅对每个部分中的一组列表项进行一次迭代。也就是说,在滚动到特定部分时,我希望一组列表项只迭代一次。这不应在连续滚动时重复。

我编写的代码会遍历每个部分以及该部分中的每个列表项,但它会在每次滚动时继续。

我希望它只对每个部分进行一次迭代。

   $(window).scroll(function(){
          var windscroll = $(window).scrollTop();
           $('body section').each(function(e){
            if($(this).position().top < windscroll){
              $(this).find(".inner-skills li").each(function(i){
              $(this).delay(i*500).animate({
                "width":"200px",
                "opacity":1
              },500);

              });
            }
          }) 
        });

【问题讨论】:

    标签: javascript jquery loops foreach each


    【解决方案1】:

    您可以使用变量来检查您是否已经滚动

    试试这个:

     var already_scrolled = 0;
     $(window).scroll(function(){
          if(already_scrolled == 0){
          already_scrolled = 1;
          var windscroll = $(window).scrollTop();
           $('body section').each(function(e){
                 if($(this).position().top < windscroll){
                    $(this).find(".inner-skills li").each(function(i){
                    $(this).delay(i*500).animate({
                       "width":"200px",
                       "opacity":1
                    },500);
    
                   });
                 }
          }) 
          }
        });
    

    【讨论】:

    • 非常酷!我不知道 .each() 有一个内置计数器。
    • 我希望它只遍历每个部分一次。 - 这只会到达第一部分,而不是遍历它们一次...
    • 这样做的结果是我只能遍历第一部分!不是在那之后。
    • 用另一个解决方案编辑答案。请立即尝试@AdhithyaKumar
    【解决方案2】:

    你需要unbind它:

    $(window).scroll(function(){
       var windscroll = $(window).scrollTop();
       $('body section').each(function(e){
          if($(this).position().top < windscroll){
             $(this).find(".inner-skills li").each(function(i){
                $(this).delay(i*500).animate({
                   "width":"200px",
                   "opacity":1
                },500);
             });
          }
       }) 
       $(window).unbind('scroll');
    });
    

    编辑:

    $(window).scroll(function(){
       var windscroll = $(window).scrollTop();
       $('body section').not('.completed').each(function(e){ //Loop through all sections WITHOUT class of completed
          if($(this).position().top < windscroll){
             $(this).find(".inner-skills li").each(function(i){
                $(this).delay(i*500).animate({
                   "width":"200px",
                   "opacity":1
                },500);
             });
             $(this).addClass('completed'); // add class of completed so it wont loop through this anymore
          }
       }) 
    });
    

    【讨论】:

    • 这不起作用。在解除绑定时,不会迭代任何部分。我的代码的问题是,即使在动画完成时,滚动事件也会被触发,这将是不必要的计算。我只想遍历每个部分一次。每个部分都有一组列表项,只需要迭代一次!
    • 根据您对评论的新理解编辑了答案。请立即尝试:)
    • 好主意。非常感谢!这为我解决了!
    猜你喜欢
    • 2018-05-14
    • 2019-12-19
    • 2018-05-23
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多