龙岗中心城网站建设顺德做网站那家好
2026/5/21 13:03:16 网站建设 项目流程
龙岗中心城网站建设,顺德做网站那家好,wordpress弹窗注册代码,泰安房产网信息网官网前端新手必看#xff1a;用事件委托轻松搞定动态元素交互#xff08;附实战技巧#xff09;前端新手必看#xff1a;用事件委托轻松搞定动态元素交互#xff08;附实战技巧#xff09;引言#xff1a;为什么你总在动态元素上绑不住点击#xff1f;事件委托到底是个啥用事件委托轻松搞定动态元素交互附实战技巧前端新手必看用事件委托轻松搞定动态元素交互附实战技巧引言为什么你总在动态元素上绑不住点击事件委托到底是个啥一图看懂背后的 DOM 冒泡机制深入事件委托的核心原理从 addEventListener 到 target 识别1. 绑定姿势2. 识别真凶3. 阻止冒泡别手滑手把手教你写一个健壮的事件委托函数支持命名空间、多事件类型和条件过滤事件委托 vs 直接绑定性能、内存和维护性的全方位对比真实项目中哪些场景非用事件委托不可比如无限滚动列表、动态表单、可编辑表格1. 无限滚动列表2. 动态表单——“加一行、减一行”3. 可编辑表格——双击单元格变输入框当事件委托“失灵”了怎么办排查 click 不触发、target 判断错位、阻止冒泡干扰的三大高频坑坑 1父级本身被阻止冒泡坑 2CSS 把子元素“ pointer-events: none ”坑 3事件类型写错提升开发效率的小妙招封装通用委托工具、结合 dataset 做语义化判断、配合现代框架的混合用法1. 再包一层让 Vue/React 也偷懒2. dataset 语义化告别硬编码3. 全局键盘快捷键也能委托别再傻傻给每个按钮绑事件了聪明人都用这招让代码又少又稳前端新手必看用事件委托轻松搞定动态元素交互附实战技巧警告阅读本文后你可能会对“给每个按钮写 onclick”产生生理性厌恶并忍不住重构祖传代码。副作用包括代码行数锐减、性能提升、同事惊呼“你开挂了吧”。引言为什么你总在动态元素上绑不住点击先讲个真事。上周组里新来的实习生小 A吭哧吭哧写了一个“待办清单”。功能不复杂输入框敲回车新增一条任务点任务前面的复选框就能标记完成。结果一测试炸了——前面 10 条复选框乖乖听话后面动态新增的 10 条怎么点都没反应。小 A 抓耳挠腮怀疑人生甚至开始迷信“ Chrome 有 BUG ”。我瞄了一眼代码差点把咖啡喷屏幕上// 新增任务时constlidocument.createElement(li);li.innerHTMLinput typecheckbox${text};list.appendChild(li);// 绑定事件li.querySelector(input).onclickfunction(){// 标记完成};问题在哪给未来还不存在的元素写 onclick浏览器表示臣妾做不到。于是小 A 开启了“加班模式”——每新增一条任务就手动再绑一次事件。代码越来越长页面越来越卡眼神越来越空洞。其实一行都不用加用“事件委托”就能让尚未出生的元素也能响应点击。下面咱们把这件“前端小棉袄”扒开揉碎讲透顺便附赠一堆拿来就用的代码保准你今晚就能提前下班。事件委托到底是个啥一图看懂背后的 DOM 冒泡机制先别急着抄代码理解原理才能横行霸道。浏览器里当你点击一个按钮其实发生了三件事捕获阶段从window一路杀到目标元素大喊“我要点你啦”。目标阶段真正被点的元素收到通知。冒泡阶段从被点元素一路往回泡直到window大喊“我点完啦”。事件委托的核心就藏在冒泡阶段把监听器绑在父级让事件飞一会儿只要经过就能截胡。父级稳如老狗子级随便增删反正最终都冒泡到我碗里来。画个灵魂示意图---------------------------------- | ul#list (爸爸) | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| | | li | li | li | ... 新 li | | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| | ▲ ▲ ▲ ▲ | | | | | | | | 事件冒泡之路 ━━━━━━━┘ | ----------------------------------只要在ul上蹲点就能一次性捕获所有li的点击管它是不是今天才生的。深入事件委托的核心原理从 addEventListener 到 target 识别1. 绑定姿势list.addEventListener(click,handler,false);// 第三个参数 false 表示冒泡阶段2. 识别真凶事件对象event.target指向真正被点的元素而event.currentTarget始终是绑定监听的元素爸爸。利用target就能“指认”是谁点了朕。functionhandler(e){constclickedEle.target;// 被点的元素if(clickedEl.matches(input[typecheckbox])){// 复选框被点了}}3. 阻止冒泡别手滑很多教程上来就e.stopPropagation()结果委托直接失灵——父级收不到泡还怎么委托除非万不得已否则别乱 interrupt 事件旅程。手把手教你写一个健壮的事件委托函数支持命名空间、多事件类型和条件过滤下面这段代码我放在生产环境跑了三年从 jQuery 时代用到 Vue 混编稳得一批。特点支持同时委托多个事件空格分隔支持自定义过滤器函数想怎么匹配就怎么匹配支持命名空间方便后期 off兼容性写到 IE9再低我就真没办法了/** * 超级事件委托工具 * param {Element} parent 父级元素 * param {String} type 事件类型可空格分隔 如 click input * param {String|Function} filter 选择器字符串或自定义函数 * param {Function} fn 真正要执行的回调 * param {String} ns 可选命名空间方便移除 */functiondelegate(parent,type,filter,fn,ns){if(!parent||!type||!filter||!fn)return;consttypestype.split(/\s/);consthandlerfunction(e){lettargete.target;// 如果 target 是文本节点取父元素if(target.nodeType3)targettarget.parentNode;// 统一封装 matchesconstmatchestypeoffilterfunction?filter(target):target.matches(filter);if(matches){// 把当前匹配元素挂到 event 上方便回调里直接取用e.delegateTargettarget;fn.call(target,e);}};// 给每个事件类型都绑上types.forEach(t{constrealTypens?${t}.${ns}:t;parent.addEventListener(t,handler,false);});// 返回卸载函数优雅returnfunctionoff(){types.forEach(t{constrealTypens?${t}.${ns}:t;parent.removeEventListener(t,handler,false);});};}/* 使用示例 */constlistdocument.querySelector(#todoList);// 1. 纯选择器写法delegate(list,click,input[typecheckbox],function(e){this.closest(li).classList.toggle(done);});// 2. 自定义过滤器只响应含有 .danger 类且>delegate(list,click,(el){returnel.classList.contains(danger)parseInt(el.dataset.id,10)100;},function(e){console.warn(高危操作被触发,this.dataset.id);},dangerZone);// 3. 同时监听点击和键盘回车delegate(list,click keyup,.btn-edit,function(e){if(e.typekeyupe.key!Enter)return;enterEditMode(this);});注释都给你写好了复制粘贴即可跑。如果你想再懒一点可以挂在window.delegate delegate全局随处调。事件委托 vs 直接绑定性能、内存和维护性的全方位对比维度直接绑定 (onclick)事件委托元素数量 N每个元素生成一个闭包内存 ≈ N×函数体积固定 1 个监听器内存 ≈ 1×函数体积动态新增新增时必须再绑一次容易忘完全不管自动生效移除元素若忘了 off闭包常驻可能泄漏无单独引用随元素销毁而释放事件解绑需要拿到原函数引用易出错统一解绑父级即可可返回 off 函数代码行数成倍膨胀一行委托全族受益结论除非你的列表只有个位数节点否则委托就是降维打击。真实项目中哪些场景非用事件委托不可比如无限滚动列表、动态表单、可编辑表格1. 无限滚动列表微博、抖音、淘宝搜索……数据拉不到底元素生生不息。直接绑定内存爆炸分分钟教你做人。// 伪代码拉到新数据后items.forEach(item{constcellrenderCell(item);container.appendChild(cell);// 如果这里绑一次内存曲线直上云霄});// 正确姿势只绑一次delegate(container,click,.item-card,function(){openDetail(this.dataset.id);});2. 动态表单——“加一行、减一行”财务报销系统最爱玩这套点“新增费用项”就多一行行内还有删除、上传发票、选择类别等按钮。// 一次委托覆盖加减上传所有按钮delegate(form,click,.btn-add,addRow);delegate(form,click,.btn-del,delRow);delegate(form,change,input[typefile],uploadInvoice);3. 可编辑表格——双击单元格变输入框delegate(table,dblclick,td,function(){constoriginalthis.textContent;this.innerHTMLinput value${original};constinputthis.querySelector(input);input.focus();input.addEventListener(blur,function(){// 失焦保存saveCell(this.parentElement.dataset.row,this.value);},{once:true});});注意这里在失焦时用了{ once: true }用完即焚不污染内存。当事件委托“失灵”了怎么办排查 click 不触发、target 判断错位、阻止冒泡干扰的三大高频坑坑 1父级本身被阻止冒泡现象点击按钮没反应console 也不报错。排查上游某段代码写了e.stopPropagation()事件根本没到委托父级。解决全局搜索stopPropagation要么干掉要么把委托层挪到更上游如document。坑 2CSS 把子元素“ pointer-events: none ”现象点击穿透target 直接是父级过滤器匹配不到。排查DevTools → Elements → 强制:hover状态看是否被禁用。解决删掉pointer-events: none或改写过滤器delegate(wrapper,click,(el){returnel.closest(.real-btn);// 允许点在子图标向上找按钮},handler);坑 3事件类型写错把input事件委托给ul结果input不冒泡W3C 规定部分事件不冒泡解决查 MDN 事件表不冒泡的别硬委托。或者改用focusin/focusout等可冒泡的替代品。提升开发效率的小妙招封装通用委托工具、结合 dataset 做语义化判断、配合现代框架的混合用法1. 再包一层让 Vue/React 也偷懒React 的 JSX 里写onClick太常见但遇到动态列表性能一样打折扣。可以借助ref把真实 DOM 掏出来再挂一次委托functionHugeList(){constulRefuseRef(null);useEffect((){constoffdelegate(ulRef.current,click,.item,(e){constide.delegateTarget.dataset.id;store.select(id);});returnoff;// 组件卸载自动解绑},[]);return(ul ref{ulRef}{list.map(item(li key{item.id}classNameitemdata-id{item.id}{item.text}/li))}/ul);}2. dataset 语义化告别硬编码buttondata-actionremovedata-id9527删除/buttondelegate(document.body,click,[data-action],function(){constactionthis.dataset.action;constidthis.dataset.id;actions[action](id);// 映射表干掉一堆 if/else});3. 全局键盘快捷键也能委托delegate(document,keydown,(el){returnel.matches(body);// 只监听在 body 层},(e){if(e.ctrlKeye.keys){e.preventDefault();saveProject();}});别再傻傻给每个按钮绑事件了聪明人都用这招让代码又少又稳写到这里估计你已经把“事件委托”刻进 DNA 了。回顾一下原理利用冒泡让父级当“包租公”收租。优点省内存、省代码、对动态元素天然友好。实战无限滚动、动态表单、可编辑表格……哪里动态点哪里。避坑别乱stopPropagation、注意不冒泡事件、警惕 CSS 坑。进阶配合框架、dataset、映射表让代码像诗一样优雅。最后送你一张“事件委托速查表”贴在工位保你永不踩坑【事件委托速查表】 1. 父级要稳 —— 别选也可能被移除的元素 2. 过滤器要准 —— matches / closest / 自定义函数 3. 不冒泡别硬上 —— input / blur / focus 乖乖直接绑 4. 内存泄漏说再见 —— 返回 off 函数组件卸载记得调用 5. 命名空间好维护 —— 批量解绑不迷路好了关掉这篇文章之前去把你项目里那一堆 forEach addEventListener 全干掉换成一行 delegate。写完跑一遍测试你会回来点赞的——性能提升肉眼可见代码量锐减一半产品经理都夸你神速。今晚的啤酒已经向你招手。欢迎来到我的博客很高兴能够在这里和您见面希望您在这里可以感受到一份轻松愉快的氛围不仅可以获得有趣的内容和知识也可以畅所欲言、分享您的想法和见解。推荐DTcode7的博客首页。一个做过前端开发的产品经理经历过睿智产品的折磨导致脱发之后励志要翻身农奴把歌唱一边打入敌人内部一边持续提升自己为我们广大开发同胞谋福祉坚决抵制睿智产品折磨我们码农兄弟专栏系列点击解锁学习路线(点击解锁知识定位《微信小程序相关博客》持续更新中~结合微信官方原生框架、uniapp等小程序框架记录请求、封装、tabbar、UI组件的学习记录和使用技巧等《AIGC相关博客》持续更新中~AIGC、AI生产力工具的介绍例如stable diffusion这种的AI绘画工具安装、使用、技巧等总结《HTML网站开发相关》《前端基础入门三大核心之html相关博客》前端基础入门三大核心之html板块的内容入坑前端或者辅助学习的必看知识《前端基础入门三大核心之JS相关博客》前端JS是JavaScript语言在网页开发中的应用负责实现交互效果和动态内容。它与HTML和CSS并称前端三剑客共同构建用户界面。通过操作DOM元素、响应事件、发起网络请求等JS使页面能够响应用户行为实现数据动态展示和页面流畅跳转是现代Web开发的核心《前端基础入门三大核心之CSS相关博客》介绍前端开发中遇到的CSS疑问和各种奇妙的CSS语法同时收集精美的CSS效果代码用来丰富你的web网页《canvas绘图相关博客》Canvas是HTML5中用于绘制图形的元素通过JavaScript及其提供的绘图API开发者可以在网页上绘制出各种复杂的图形、动画和图像效果。Canvas提供了高度的灵活性和控制力使得前端绘图技术更加丰富和多样化《Vue实战相关博客》持续更新中~详细总结了常用UI库elementUI的使用技巧以及Vue的学习之旅《python相关博客》持续更新中~Python简洁易学的编程语言强大到足以应对各种应用场景是编程新手的理想选择也是专业人士的得力工具《sql数据库相关博客》持续更新中~SQL数据库高效管理数据的利器学会SQL轻松驾驭结构化数据解锁数据分析与挖掘的无限可能《算法系列相关博客》持续更新中~算法与数据结构学习总结通过JS来编写处理复杂有趣的算法问题提升你的技术思维《IT信息技术相关博客》持续更新中~作为信息化人员所需要掌握的底层技术涉及软件开发、网络建设、系统维护等领域的知识《信息化人员基础技能知识相关博客》无论你是开发、产品、实施、经理只要是从事信息化相关行业的人员都应该掌握这些信息化的基础知识可以不精通但是一定要了解避免日常工作中贻笑大方《信息化技能面试宝典相关博客》涉及信息化相关工作基础知识和面试技巧提升自我能力与面试通过率扩展知识面《前端开发习惯与小技巧相关博客》持续更新中~罗列常用的开发工具使用技巧,如 Vscode快捷键操作、Git、CMD、游览器控制台等《photoshop相关博客》持续更新中~基础的PS学习记录含括PPI与DPI、物理像素dp、逻辑像素dip、矢量图和位图以及帧动画等的学习总结日常开发办公生产【实用工具】分享相关博客》持续更新中~分享介绍各种开发中、工作中、个人生产以及学习上的工具丰富阅历给大家提供处理事情的更多角度学习了解更多的便利工具如Fiddler抓包、办公快捷键、虚拟机VMware等工具吾辈才疏学浅摹写之作恐有瑕疵。望诸君海涵赐教。望轻喷嘤嘤嘤非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。愿斯文对汝有所裨益纵其简陋未及渊博亦足以略尽绵薄之力。倘若尚存阙漏敬请不吝斧正俾便精进

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询