(转)关于jquery的$(document).on()事件多次执行的问题

http://www.seozhijia.net/javascript/99.html

 

我们在使用$(document).on()来绑定事件的时候,有时候会出现同一个事件会执行多次的问题,为什么会这样呢?其实很简单,就是这段代码在执行的过程中进行了多次绑定,或者将$(document).on()放在了循环里,或者是相互嵌套用on()事件,笔者曾经犯过相互嵌套用得错误,比如,在弹出一个窗口之后,这个窗口上有很多的点击事件,按照下面这样写就会出现多次绑定的情况;

嵌套写法:

$(document).on("click",".popup-confirm-new-up",function(){
      //执行代码
   $(document).on("click",".up-product-button-sure",function(){
         //执行代码
   });

   $(document).on("click",".up-product-button-cancel",function(){
         //执行代码
   });
})(document).on("click",".popup-confirm-new-up",function(){
      //执行代码
   $(document).on("click",".up-product-button-sure",function(){
         //执行代码
   });

   $(document).on("click",".up-product-button-cancel",function(){
         //执行代码
   });
})
 
以上这种写法,虽然在代码的分布上面比较好看,但是弊端就是当外面的大事件执行多次的时候,里面的绑定事件就会执行多次,正确的写法如下,把他们都独立出来写:
 
$(document).on("click",".popup-confirm-new-up",function(){
    //执行代码
   
})
$(document).on("click",".up-product-button-sure",function(){
    //执行代码
});

$(document).on("click",".up-product-button-cancel",function(){
   //执行代码
});(document).on("click",".popup-confirm-new-up",function(){
    //执行代码
   
})
$(document).on("click",".up-product-button-sure",function(){
    //执行代码
});

$(document).on("click",".up-product-button-cancel",function(){
   //执行代码
});
 


所以,注意:相互嵌套的写法不推荐。

但是如果你一定要嵌套这种写法,还有一个解决多次绑定多次执行的办法就是在绑定之前先解绑一次,上面on事件嵌套的写法如下:

$(document).on("click",".popup-confirm-new-up",function(){
   
    //执行代码
      //执行代码
   $(document).off("click",".up-product-button-sure").on("click",".up-product-button-sure",function(){
         //执行代码
   });

   $(document).off("click",".up-product-button-cancel").on("click",".up-product-button-cancel",function(){
         //执行代码
   });
   
})
//注意:是哪个事件会多次执行就在哪个on()前面先绑一次off();比如本文第一种写法,就应该是里面的两个on()前面加off()解绑事件;(document).on("click",".popup-confirm-new-up",function(){
   
    //执行代码
      //执行代码
   $(document).off("click",".up-product-button-sure").on("click",".up-product-button-sure",function(){
         //执行代码
   });

   $(document).off("click",".up-product-button-cancel").on("click",".up-product-button-cancel",function(){
         //执行代码
   });
   
})
//注意:是哪个事件会多次执行就在哪个on()前面先绑一次off();比如本文第一种写法,就应该是里面的两个on()前面加off()解绑事件;
先解绑再绑定,就可以避免多次执行。
 

 

不使用document绑定事件,常见的嵌套写法还有:

 

$(".selector").on("click",function(){
     //执行代码

     $(".selectorA").off("click").on("click",function(){
         //执行代码
     })


     $(".selectorB").off("click").on("click",function(){
         //执行代码
     })
})
(".selector").on("click",function(){
     //执行代码

     $(".selectorA").off("click").on("click",function(){
         //执行代码
     })


     $(".selectorB").off("click").on("click",function(){
         //执行代码
     })
})
 

jQuery解除绑定事件 https://www.cnblogs.com/superCwen/p/9917672.html

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值