浅析jquery某一元素重复绑定的问题


Posted in Javascript onJanuary 03, 2014

某天晚上写代码的时候,突然出了bug,想了很久都不知道问题出在哪里(其实是很简单的问题,但由于我还是个菜鸟,所以不知道)。几经周折,这中间的过程就不提了,终于让我在快崩溃的时候,发现了原因。原来是因为同一jquery元素可以重复绑定,当使用了嵌套绑定的时候,就容易出错。如代码:

$('.test').bind('click',function(){ 
     $('.last').bind('click',function(){ 
          alert('nihao'); 
     }); 
}); <button class="test">上一级绑定</button> 
<button class="last">下一级绑定</button>

当我点击第一个button时,再点击第二个button,是没有问题的。可如果在页面刷新之前,点击了多次(n次)第一个button的话,此时再点击第二个button,就出问题了,就会弹出(n个)alert对话框。

解决办法:在会重复绑定的元素上执行解绑,即unbind(),如:

$('.test').bind('click',function(){ 
     $('.last').unbind('click').bind('click',function(){ 
          alert('nihao'); 
     }); 
});
 
这样,不管点击多少次第一个button,再点击第二个时,只会弹出一个alert对话框。

这里再介绍两个与bind()相关联的,one()和live()。
 
one() 方法为被选元素附加一个或多个事件处理程序,并规定当事件发生时运行的函数。当使用 one() 方法时,每个元素只能运行一次事件处理器函数。通俗的讲就是只管用一次。

至于live(),引用别人讲的(http://www.cnblogs.com/wujilong/articles/1866834.html):
平时在使用jQuery进行AJAX操作的时候,新生成的元素事件会失效,有时候不得不重新绑定一下事件,但是这样做很麻烦。例如评论分页后对评论内容的JS验证会失效等。在jQuery1.3之前有一个插件会解决这个问题http://jquery.com/ ,jQuery1.3增加了一个live()方法,下面是手册上的说明:

jQuery 1.3中新增的方法。给所有当前以及将来会匹配的元素绑定一个事件处理函数(比如click事件)。也能绑定自定义事件。

目前支持 click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyup。

还不支持 blur, focus, mouseenter, mouseleave, change, submit

与bind()不同的是,live()一次只能绑定一个事件。

这个方法跟传统的bind很像,区别在于用live来绑定事件会给所有当前以及将来在页面上的元素绑定事件(使用委派的方式)。比如说,如果你给页面上所有的li用live绑定了click事件。那么当在以后增加一个li到这个页面时,对于这个新增加的li,其click事件依然可用。而无需重新给这种新增加的元素绑定事件。

.live()与流行的liveQuery插件很像,但有以下几个主要区别:

•.live 目前只支持所有事件的子集,支持列表参考上面的说明。
•.live 不支持liveQuery提供的“无事件”样式的回调函数。.live只能绑定事件处理函数。
•.live 没有”setup”和”cleanup”的过程。因为所有的事件是委派而不是直接绑定在元素上的。

要移除用live绑定的事件,请用die方法

用法示例:
<div class=”myDiv”></div>

jquery:
$(“.myDiv”).live(“click”, function(){
alert(“clicked!”);
});

如果使用javascript动态创建一个class为mydiv的元素,点击元素依然会有弹出。为什么使用live后就有了呢?这是因为jquery利用了事件的冒泡机制,直接把事件绑定在了document上,然后通过event.target找出事件的来源。这跟jquery.livequery插件不一样,jquery.livequery每20毫秒做一次检查,如有新生成则重新绑定一次事件。

使用live当然有利也有弊:

好处就是:元素更新时不用反复去定义事件。
坏处就是:把事件绑定在document上会在页面上每一个元素都呼叫一次,如使用不当会严重影响性能。而且不支持blur, focus, mouseenter, mouseleave, change, submit。

Javascript 相关文章推荐
jQuery实战之品牌展示列表效果
Apr 10 Javascript
Javascript 倒计时源代码.(时.分.秒) 详细注释版
May 09 Javascript
js字符串转成JSON
Nov 07 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
Apr 08 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
Oct 23 Javascript
jQuery实现鼠标经过事件的延时处理效果
Aug 20 Javascript
Ajax验证用户名或昵称是否已被注册
Apr 05 Javascript
详解基于node.js的脚手架工具开发经历
Jan 28 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
Sep 10 Javascript
Vue vm.$attrs使用场景详解
Mar 08 Javascript
vue 弹出遮罩层样式实例
Jul 22 Javascript
vue setInterval 定时器失效的解决方式
Jul 30 Javascript
jquery live()重复绑定的解决方法介绍
Jan 03 #Javascript
解决JS中乘法的浮点错误的方法
Jan 03 #Javascript
浅析IE10兼容性问题(frameset的cols属性)
Jan 03 #Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
Jan 03 #Javascript
JS+JSP checkBox 全选具体实现
Jan 02 #Javascript
使用js完成节点的增删改复制等的操作
Jan 02 #Javascript
js实现动态改变字体大小代码
Jan 02 #Javascript
You might like
PHP删除目录及目录下所有文件的方法详解
2013/06/06 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
2014/08/22 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
JS Ajax请求如何防止重复提交
2016/06/13 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
原生js实现放大镜
2017/02/20 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
2017/04/25 jQuery
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
微信小程序 如何引入外部字体库iconfont的图标
2018/01/31 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
python中requests小技巧
2017/05/10 Python
Python iter()函数用法实例分析
2018/03/17 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
详解Python 最短匹配模式
2020/07/29 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
2021/01/27 Python
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
外贸采购员求职的自我评价
2013/11/26 职场文书
企业党员个人自我评价
2014/09/20 职场文书
党风廉政教育心得体会2016
2016/01/22 职场文书
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android