1. 主页 > 好文章

动态元素事件处理技巧:jQuery.on()方法开发指南

你是不是经常遇到这种情况?用.append()动态生成的按钮死活点不动,明明用.click()绑定了事件却像石头一样没反应。今天咱们就掀开jQuery事件处理的底裤,看看这个.on()方法到底藏着什么玄机。


??为什么我的动态元素点不响???
这个灵魂拷问至少坑过80%的jQuery新手。记住这个铁律:??直接给动态元素绑定事件等于竹篮打水??。举个例子:

javascript复制
// 错误示范:给动态创建的.btn绑定点击
$('.btn').click(function(){...})

// 正确姿势:用.on()委托给父容器
$('#container').on('click', '.btn', function(){...})

这里的关键在于??事件委托??,原理就像快递驿站——包裹(事件)先送到驿站(父元素),再由驿站分发给具体收件人(目标元素)。


??事件绑定的三大段位对比??

方法静态元素动态元素内存消耗
.click()??
.bind()??极高
.on()??

表格说明一切:??.on()才是全能选手??。特别是处理动态生成的表格行、弹窗按钮这些场景,不用事件委托就是在给自己挖坑。


??自问自答时间:??
Q:为什么用.on()有时候也失效?
A:检查三个要素:

  1. 父元素必须??在绑定时就存在??
  2. 选择器参数不能省略
  3. 事件类型别拼错(比如click写成clik)

Q:移动端点击有延迟怎么破?
A:试试这个组合拳:

javascript复制
$('#mobileBtn').on('touchstart click', function(e){
  e.preventDefault();
  // 你的业务代码
});

记住要加preventDefault(),不然安卓机会给你表演双击放大页面的行为艺术。


??性能优化冷知识??
很多人不知道,事件委托用多了也会翻车。比如给document绑定点击事件:

javascript复制
// 危险操作:全文档监听
$(document).on('click', '.btn', function(){...})

// 正确做法:限定最近静态父级
$('#sidebar').on('click', '.menu-item', function(){...})

??越靠近动态元素的静态容器越好??,这样事件冒泡路径短,性能损耗小。别图省事直接挂document上,小心页面卡成PPT。


小编观点:现在虽然流行Vue/React这些框架,但老项目维护和轻量级开发还是绕不开jQuery。把.on()的事件委托机制吃透,能少加50%的班。下次遇到动态元素事件问题,先想想是不是在跟静态元素搞异地恋,赶紧给它们找个靠谱的"中介"(父容器)就对了。

本文由嘻道妙招独家原创,未经允许,严禁转载