为了账号安全,请及时绑定邮箱和手机立即绑定

jQuery 嵌套 event 会触发多次的原因?

jQuery 嵌套 event 会触发多次的原因?

狐的传说 2019-04-09 20:25:35
Html代码如下:jQuery代码如下:$('#cover').mouseover(function(){$('#inside').click(function(){alert('multipletimes');});});$('#cover_js').mouseover(function(){document.getElementById('inside_js').onclick=function(){alert('justonetime');}});$('#outside').click(function(){alert('justonetime');});id为inside的按钮的click事件被嵌套在div的鼠标事件内,而id为outside的按钮则未嵌套,分别对两个按钮进行多次点击后,inside按钮绑定的click事件会进行累加,而outside按钮则仍旧只绑定一个click事件。id为inside_js的按钮的click事件也被嵌套在div的鼠标事件内,但是我用javascript实现click,此时点击多次后,只触发一个alert。解决上述问题可以用unbind对嵌套event进行解绑:$('#cover').mouseover(function(){$('#inside').unbind('click').click(function(){alert('multipletimes');});});但是我想知道为什么Jquery嵌套event会对事件进行累加,从而导致触发多次呢?
查看完整描述

2 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

谢邀,俺正忙着写Vim的哲学呢,呵呵~简单说说:
所有的事件绑定(.click,.mouseover,.hover等等)都是委托给更底层的.on方法的,通过查看其源码得知.on最终会调用$.event.add方法
我没有细细去看$.event对象的全部内容,只是看到这一行的时候,我似乎有些明悟了。
jQuery为每一个事件回调函数生成一个guid,保证它们都是独一无二的(即使函数内容相同)
如果你继续往后看,会发现这些回调函数都被push到一个数组里保存,所以当时间触发的时候,它们也应该是一个个从数组里取出来再执行(或许是为了保证注册在同一事件下不同回调函数的执行顺序,但是像你这样内容一样的回调函数就不好判断了,所以如果你不得不多次绑定内容一样的回调,先解绑)。这就是为什么会产生你问题中效果的原因。
至于jQuery为什么要这样去设计我还没有去求证,我猜是为了更强大的事件管理能力,至于bindafterunbind这样的副作用也许在jQueryTeam看来是微不足道的牺牲吧。
                            
查看完整回答
反对 回复 2019-04-09
  • 2 回答
  • 0 关注
  • 352 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号