jQuery on()绑定动态元素出现的问题小结


Posted in Javascript onFebruary 19, 2016

jQuery on()方法是官方推荐的绑定事件的一个方法。使用 on() 方法可以给将来动态创建的动态元素绑定指定的事件,例如append等。

之前使用 on 的时候一直是

$("").on('click','function(){ 
}')

之后发现有些时候一直无法绑定(比如元素动态生成时),查看文档后发现正确用法应该是

$(document).on("change","#pageSize_out",function(){ 
if($("#page_out").val()!=0){ 
$("#pageSize").val($(this).val()); 
list(); 
} 
})

同时,注意

As this answers receives a lot of attention, here are two supplementary advises :

1) When it's possible, try to bind the event listener to the most precise element, to avoid useless event handling.

That is, if you're adding an element of class b to an existing element of id a, then don't use
$(document.body).on('click', '#a .b', function(){
but use
$('#a').on('click', '.b', function(){

2) Be careful, when you add an element with an id, to ensure you're not adding it twice. Not only is it "illegal" in HTML to have two elements with the same id but it breaks a lot of things. For example a selector "#c" would retrieve only one element with this id.

on(events,[selector],[data],fn)

events:一个或多个用空格分隔的事件类型和可选的命名空间,如"click"或"keydown.myPlugin" 。
selector:一个选择器字符串用于过滤器的触发事件的选择器元素的后代。如果选择器为null或省略,当它到达选定的元素,事件总是触发。

data:当一个事件被触发时要传递event.data给事件处理函数。

fn:该事件被触发时执行的函数。 false 值也可以做一个函数的简写,返回false。

替换bind()

当第二个参数'selector'为null时,on()和bind()其实在用法上基本上没有任何区别了,所以我们可以认为on()只是比bind()多了一个可选的'selector'参数,所以on()可以非常方便的换掉bind()

替换live()

在1.4之前相信大家非常喜欢使用live(),因为它可以把事件绑定到当前以及以后添加的元素上面,当然在1.4之后delegate()也可以做类似的事情了。live()的原理很简单,它是通过document进行事件委派的,因此我们也可以使用on()通过将事件绑定到document来达到live()一样的效果。

live()写法

代码如下:

$('#list li').live('click', '#list li', function() {
//function code here.
});

on()写法

代码如下:

$(document).on('click', '#list li', function() {
//function code here.
});

这里的关键就是第二个参数'selector'在起作用了。它是一个过滤器的作用,只有被选中元素的后代元素才会触发事件。

替换delegate()

delegate()是1.4引入的,目的是通过祖先元素来代理委派后代元素的事件绑定问题,某种程度上和live()优点相似。只不过live()是通过document元素委派,而delegate则可以是任意的祖先节点。使用on()实现代理的写法和delegate()基本一致。

delegate()的写法

代码如下:

$('#list').delegate('li', 'click', function() {
//function code here.
});

on()写法

代码如下:

$('#list').on('click', 'li', function() {
//function code here.
});

貌似第一个和第二个参数的顺序颠倒了一下,别的基本一样。

总结

jQuery推出on()的目的有2个,一是为了统一接口,二是为了提高性能,所以从现在开始用on()替换bind(), live(), delegate吧。尤其是不要再用live()了,因为它已经处于不推荐使用列表了,随时会被干掉。如果只绑定一次事件,那接着用one()吧,这个没有变化。

jquery on() 方法绑定动态元素

废话不多说了,直接给大家贴代码了。

<div id="test">
<div class="evt">evt1</div>
</div>

错误的用法,下面方法只为第一个class 为 evt 的div 绑定了click事件,使用append动态创建的div则没有绑定

<script>
// 先绑定事件再添加div
$('#test .evt').on('click', function() {alert($(this).text())});
$('#test').append('<div class="evt">evt2</div>');
</script>

正确的用法如下:

<script>
$('body').on('click', '#test .evt', function() {alert($(this).text())});
$('#test').append('<div class="evt">evt2</div>');
</script>
Javascript 相关文章推荐
使用隐藏的new来创建对象
Mar 29 Javascript
网站404页面3秒后跳到首页的实例代码
Aug 16 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
May 20 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
May 14 Javascript
Angular2下使用pdf插件的方法详解
Apr 29 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
Jul 04 Javascript
关于js中的鼠标事件总结
Jul 11 Javascript
zTree异步加载展开第一级节点的实现方法
Sep 05 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
Feb 11 Javascript
jquery层次选择器的介绍
Jan 18 jQuery
微信小程序时间标签和时间范围的联动效果
Feb 15 Javascript
vue props 一次传多个值实例
Jul 22 Javascript
学习javascript文件加载优化
Feb 19 #Javascript
初识angular框架后的所思所想
Feb 19 #Javascript
复杂的javascript窗口分帧解析
Feb 19 #Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
Feb 19 #Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
Feb 19 #Javascript
谈一谈javascript中继承的多种方式
Feb 19 #Javascript
多种js图片预加载实现方式分享
Feb 19 #Javascript
You might like
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
2012/12/07 PHP
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
2015/10/26 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
jquery实现楼层滚动效果
2018/01/01 jQuery
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
简明 Python 基础学习教程
2007/02/08 Python
linux环境下安装pyramid和新建项目的步骤
2013/11/27 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
PyTorch学习笔记之回归实战
2018/05/28 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
python爬虫请求头的使用
2020/12/01 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
zooplus波兰:在线宠物店
2019/07/21 全球购物
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
雷锋式好少年事迹材料
2014/08/17 职场文书
三孔导游词
2015/02/05 职场文书
中秋节慰问信
2015/02/15 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL
JavaScript实现九宫格拖拽效果
2022/06/28 Javascript