2014-02-25 50 views
1

下面的代码:为什么我的方法执行两次?

$(document).ready(function() { 

    $('.category').click(function(){ 
     $("#category-menu").modal(); 
     $("#category-menu").css({'display' : 'block'}); 
     $('.single-category').click(function(){ 
      $('.category-link').fadeOut('slow', 'linear', fadeInCategory($(this))); 
    /*the line above some how gets called again*/ 
     }); 

    }); 

    $('.mp-back').click(function(){ 
     $('.category-link').css('display', 'none'); 
     var testing = $(this).closest('.mp-level'); 
     testing.css('display', 'none'); /*after this line */ 
    }); 

}); 

function fadeInCategory(category){ 
    category.find('.mp-level').fadeIn('slow'); 
    category.find('ul').fadeIn('slow'); 
} 
function back2allCategories(){ 
    $('.category-link').css('display', 'block'); 
} 

$('.single-category')点击我淡出了一堆的HTML,并在短短这个孩子褪色。
mp-back应该回迁,所以我淡出(或设置display:none作为一个属性)

然而,一旦$('.mp-back').click(function(){已经执行完毕,这条线:

$('.category-link').fadeOut('slow', 'linear', fadeInCategory($(this))); 

不知怎的,它再次被执行,我可以不知道为什么。
(我知道这是通过在谷歌Chrome控制台中的折点发生)

但是我无法真正弄清楚为什么。

为什么$('.category-link').fadeOut('slow', 'linear', fadeInCategory($(this)));被重新调用?

+6

你应该几乎从不调用里面绑定另一个事件处理函数的事件处理函数。每次你点击'.category'你为'.single-category'绑定一个额外的点击处理器,所以你最终得到了多个处理器。 – Barmar

+0

嗯..这是有道理的...是这个问题,还是只是良好的做法? – brendosthoughts

+2

这就是问题所在。 –

回答

3

每当您单击.category时,您正在为.category-link分配一个新处理程序。保持足够的时间,你会崩溃的浏览器。

有一个事件处理程序应该分配另一个事件的情况非常少。这不是其中之一;)

+0

谢谢......这是有道理的......不是解决我遇到的问题......一个处理程序是另一个孩子因此我为什么看到debuger中的循环...但这是我不是awre的东西,清楚/逻辑上可能是一个大问题...我的代码不再看起来像张贴..并希望错误生病永远不会再做一次 – brendosthoughts

0

除了Niets的回答,您可以使用解除绑定您的点击事件来解决问题,例如

$('.category').click(function(){ 
    $("#category-menu").modal(); 
    $("#category-menu").css({'display' : 'block'}); 
    // unbind the click before binding it again 
    $('.single-category').unbind('click').click(function(){ 
     $('.category-link').fadeOut('slow', 'linear', fadeInCategory($(this))); 
     /*the line above some how gets called again*/ 
    }); 
}); 

显然,这是一个解决办法,我不建议这样做,它只是一些作品:)

相关问题