浅析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 相关文章推荐
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
Aug 13 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
May 07 Javascript
jquery特效 幻灯片效果示例代码
Jul 16 Javascript
jquery 提示信息显示后自动消失的具体实现
Dec 18 Javascript
JQuery CheckBox(复选框)操作方法汇总
Apr 15 Javascript
详解AngularJS中的作用域
Jun 17 Javascript
JS建造者模式基本用法实例分析
Jun 30 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
Sep 26 Javascript
Angular2进阶之如何避免Dom误区
Apr 02 Javascript
js中Object.defineProperty()方法的不详解
Jul 09 Javascript
vue+iview+less 实现换肤功能
Aug 17 Javascript
ES10 特性的完整指南小结
Mar 04 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 empty函数 使用说明
2009/08/10 PHP
php利用cookie实现访问次数统计代码
2011/05/19 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
K-means聚类算法介绍与利用python实现的代码示例
2017/11/13 Python
Python实现pdf文档转txt的方法示例
2018/01/19 Python
python实现超市扫码仪计费
2018/05/30 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
人工神经网络算法知识点总结
2019/06/11 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
python判断两个序列的成员是否一样的实例代码
2020/03/01 Python
10个顶级Python实用库推荐
2021/03/04 Python
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
ShellScript面试题一则-ShellScript编程
2014/06/24 面试题
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
实施意见格式范本
2015/06/05 职场文书
环保宣传语大全
2015/07/13 职场文书
小学英语课教学反思
2016/02/15 职场文书
pytorch交叉熵损失函数的weight参数的使用
2021/05/24 Python