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 相关文章推荐
点击按钮或链接不跳转只刷新页面的脚本整理
Oct 22 Javascript
javascript调试之DOM断点调试法使用技巧分享
Apr 15 Javascript
JavaScript表格常用操作方法汇总
Apr 15 Javascript
浅谈JavaScript 数据属性和访问器属性
Sep 01 Javascript
easyui导出excel无法弹出下载框的快速解决方法
Nov 10 Javascript
微信小程序 swiper组件轮播图详解及实例
Nov 16 Javascript
js数字计算 误差问题的快速解决方法
Feb 28 Javascript
简单谈谈js的数据类型
Sep 25 Javascript
详解使用Next.js构建服务端渲染应用
Jul 10 Javascript
js实现倒计时器自定义时间和暂停
Feb 25 Javascript
微信小程序实现跳转的几种方式总结(推荐)
Apr 24 Javascript
微信小程序后端(java)开发流程的详细步骤
Nov 13 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 strtotime 函数UNIX时间戳
2009/01/14 PHP
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
php中的三元运算符使用说明
2011/07/03 PHP
php curl的深入解析
2013/06/02 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2014/07/02 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
2019/03/27 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
Javascript学习笔记二 之 变量
2010/12/15 Javascript
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
javascript常用函数(1)
2015/11/04 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
2016/01/22 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
webpack搭建vue 项目的步骤
2017/12/27 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
利用Hyperic调用Python实现进程守护
2018/01/02 Python
Python递归实现汉诺塔算法示例
2018/03/19 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
Python实现蒙特卡洛算法小实验过程详解
2019/07/12 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
Keras自定义实现带masking的meanpooling层方式
2020/06/16 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
Linux如何为某个操作添加别名
2015/02/05 面试题
研究生自荐信
2013/10/09 职场文书
《桂林山水》教学反思
2014/02/08 职场文书
军训自我鉴定200字
2014/02/13 职场文书
求职信结尾怎么写
2014/05/26 职场文书
好人好事演讲稿
2014/09/01 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
《桂花雨》教学反思
2016/02/19 职场文书
Java Dubbo框架知识点梳理
2021/06/26 Java/Android