
嘻道奇闻
- 文章199742
- 阅读14625734
移动端开发必看:jQuery动态元素事件委托的3种高效方法
哎,你是不是遇到过这种情况?在移动端开发时,明明用jQuery给按钮绑定了点击事件,结果动态加载的新按钮死活不响应?气得想摔手机对吧?新手如何快速涨粉这种运营问题可能简单,但代码问题真能卡死人啊...别慌,今天咱们就掰开了揉碎了说透这个坎儿!
(抓耳挠腮思考状)先说个真实案例:上周有个学员做购物车功能,新增的商品删除按钮全都不干活。他熬到凌晨三点愣是没搞定,最后发现是事件绑定的姿势不对——这破事坑过多少人啊!
一、搞懂基本原理才能不踩坑
事件委托说白了就是??让父元素帮子孙元素打工??。比如你有个
- 列表,里面
- 都是动态生成的。直接给每个
- 绑事件?新加的肯定不认账啊!这时候就得让
- 这个当爹的来管事。
- ??冒泡机制??:子元素触发事件会像冒泡泡一样传到父级
- ??事件目标判定??:通过event.target确认到底是哪个崽儿触发的
原理核心就两点:
(拍大腿)对嘛!就像快递驿站,包裹都放架子上(父元素),你报取件码(事件类型)就能找到自己的快递(目标元素),管它是昨天到的还是刚送来的新件!
二、三种亲测好用的实战方法
??方法1:传统.delegate()??
javascript复制
$('#parent').delegate('.child', 'click', function(){ // 动态加载的.child元素也能触发 });
这法子适合jQuery 1.4.2+版本,注意啊现在官方不推荐用了,但老项目里还能见到。
??方法2:万能.on()??
javascript复制
$('#parent').on('click', '.child', function(){ // 现在主推的写法 });
重点来了!参数顺序别搞反:??事件类型放第二,选择器放第三??。见过太多人写成.on('.child','click')直接报错,急得抓耳挠腮的...
??方法3:结合document兜底??
javascript复制
$(document).on('swipeLeft', '.dynamic-element', function(){ // 处理移动端左滑事件 });
特别适合??全屏滑动组件??这种不确定父级的情况。不过要注意别滥用,层级太高会影响性能。
(突然停顿)这时候你可能会问了:这三个方法到底该咋选?咱们直接上对比表格:
方法 适用场景 性能消耗 兼容性 .delegate() 老版本维护 中 jQuery1.4+ .on() 常规动态元素 低 jQuery1.7+ document兜底 跨组件/复杂结构 较高 全版本 三、自问自答环节
??Q:为什么有时候事件会触发两次???
A:八成是绑定时机不对!比如在ajax回调里重复绑定,跟发传单似的见人就塞,结果用户点一次触发N次。正确的做法是在??页面初始化时一次性绑定??。??Q:移动端滑动事件总是不灵敏???
A:试试加上touch事件库!jQuery本身对touch事件支持有限,推荐用??jquery-mobile??或者??Hammer.js??扩展。记得在委托时用事件命名空间:javascript复制
$('#wrapper').on('swipeleft.ui', '.item', function(){ // 像这样加.ui后缀方便后期解绑 });
??Q:委托后怎么阻止事件冒泡???
A:两种路子任选:- 在回调里写??event.stopPropagation()??
- 在目标元素判断时直接return
javascript复制
if(!$(event.target).hasClass('active')) return;
(挠头思考)突然想到个重点:很多人不知道委托还能玩事件过滤!比如只处理长按事件:
javascript复制
var timer; $('#list').on('touchstart', '.item', function(){ timer = setTimeout(function(){ // 长按1秒触发 }, 1000); }).on('touchend', function(){ clearTimeout(timer); });
小编观点:其实现在很多新人觉得jQuery过时了,但你看饿了么这些大厂移动端照样在用。关键是要掌握这些??活化石级的技术精髓??,毕竟维护老项目时这些知识能救命啊!