2014-09-03 66 views
0

我有这种处理器的事件处理程序处理选择两次

$(".mydiv").on('click', function(e){ 

// some logic 
$(this).toggleClass('active'); 

//other logic 

}); 

我已经在那里被触发这两次事件中的错误,我看到,在第一次运行this".mydiv"并在第二次运行this".mydiv.active"而且看起来".mydiv.active"在事件处理期间添加到与选择器匹配的节点列表中

有没有办法解决这个问题?

这是更全面的代码:

$(".filter_view:not(.mobile-view) .filter_content .cat, .filter_view:not(.mobile-view) .filter_content .check_area, .mobile-view .search_filter").on("click", function(e){ 
     debugger; 

     $(this).toggleClass("active"); 
       e.stopPropagation(); 

// rest of the logic 

}); 

<span class="check_area col-xs-4 col-md-2"> 
    <input class="filter_checkbox" id="Neve" name="Neve" type="checkbox" value="Neve"> 
    <label class="filter_checkbox_label" for="Neve">Neve</label> 
</span> 

基本上,父为.filter_view,但在移动它有一个.mobile-view类,所以在移动我希望search_filter在点击的时候做逻辑上不移动在check_area(这是复选框+标签)和.cat(类别)

当检查第一个和第二个触发器上的事件时,第一个目标是标签(我点击了)但第二个目标是复选框(我没有点击)

即使我停止传播,这可能是因为自举(或一些其他的框架LIB)具​​有当标签被点击复选框是click()版以及的事件?

+0

你有没有试过e.preventDefault(); ? – 2014-09-03 08:27:29

+2

检查事件注册码是否被调用两次 – 2014-09-03 08:27:33

+0

@ArunPJohny是最有可能发现的。事件处理程序将被执行两次的唯一方法是它被调用两次,通常是因为分配它的代码运行两次。 – Archer 2014-09-03 08:32:00

回答

0

尝试

$(".mydiv").on('click', function(e){ 

// some logic 
$(this).toggleClass('active'); 

e.stopPropagation(); 

}); 

stopPropagation()阻止事件的冒泡。

+0

我已停止传播,在toggleClasses不起作用之前和之后 – 2014-09-03 08:35:40

0

添加$(".mydiv").off('click');绑定click事件,你给我们的代码可能正在调用两次,结合事件处理程序前两次。也许你在一个不止一次被调用的init()函数中有它?

+0

没有init,它在$(document).ready() – 2014-09-03 08:39:55

+0

事件被触发两次的机会很渺茫:http://stackoverflow.com/a/10727036/2295592 – 2014-09-03 09:16:46