javascript事件委托理解,jQuery on 方法一步到位实现事件委托
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript事件委托理解,jQuery on 方法一步到位实现事件委托,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6160字,纯文字阅读大概需要9分钟。
内容图文
本篇文章借鉴自:博客园文章,只为自己巩固下事件委托方面的知识
概述:
什么叫事件委托?他还有一个名字叫做事件代理,(时间代理 === 事件委托,现在才知道这两个是一个意思)
高程3上讲:事件委托即是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。
借鉴其他大牛的一个例子,也为自己更好的理解一下:收快递例子有三个同事预计会在周一收到快递。为签收快递,有两种办法:一是三个人在公司门口等快递;二是委托给前台MM代为签收。现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递)。前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款。这种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台MM也会在收到寄给新员工的快递后核实并代为签收。
两层意思: 1.现在委托前台的同事是可以签收的,即程序中的现有的dom节点是有事件的; 2.新员工也是可以被前台mm代为签收的,即程序中新添加的dom节点也是有事件的;
为什么要用事件委托???事件委托有什么好处???
一般来说,dom是需要有事件处理程序的,我们会直接给他事件处理程序就好了,那么如果是很多dom元素需要添加事件处理呢??? 比如 100个li,每个li 都有相同的click点击事件,可能我们会有for循环的方法,来遍历所有li,然后为每个li添加绑定事件。 这么做毫无疑问的是对性能有很大的影响;
在js中,添加到页面上的事件处理程序的多少将直接关系到页面运行的整体性能,因为需要不断的与dom节点进行交互,访问dom次数越多,引起浏览器重绘与重排的次数也就越多,就会延长整个页面的交互就绪时间。 这就是性能优化,减少dom操作的原因;
如果采用事件委托,就会将所有的操作放到js程序里面,与dom的操作就只交互一次,这样减少了dom交互次数,性能就会提升; 事件委托原理: 事件委托就是利用事件冒泡原理实现的! 事件冒泡:就是事件从最深节点开始,然后逐步向上传播事件; 例:页面上有一个节点树,div > ul ?> li ?> ?a 比如给最里面的a 加一个click 事件,那么事件就会一层一层的往外执行,执行顺序 a > li > ul > div, ?有这样一个机制,当我们给最外层的div 添加点击事件,那么里面的ul , li ?, a ?做点击事件的时候,都会冒泡到最外层的div上,所以都会触发,这就是事件委托,委托他们父集代为执行事件;
业务需求:实现功能,点击td ,单元格变色; html结构 [html]?view plain?copy ?
- <!-- 事件绑定 -->
- <table id="myTable" border="1">
- <tr>
- <td>1</td>
- <td>2</td>
- <td>3</td>
- </tr>
- </table>
- window.onload = function(){
- var oTa = document.getElementById("myTable");
- var aTd = oTa.getElementsByTagName('td');
- for(var i=0;i<aTd.length;i++){
- aTd[i].onclick = function(){
- aTd[i].style.background = 'red';
- }
- }
- }
那我们用事件委托的方式怎么来写呢,??
[javascript]?view plain?copy ?
- window.onload = function(){
- var oTa= document.getElementById("myTable");
- oTa.onclick = function(){ //点击 table、td均可以alert(123)
- alert(123);
- }}
- <pre></pre>
- <pre></pre>
当然单当点击table本身的时候也是会触发的; 如果我们只想让td触发而不想让table触发,怎么办呢???
Event对象提供了一个属性叫做target,可以返回事件的目标节点,我们称之为事件源,也就是说,target就可以表示当前事件操作的dom,但可能不是真正操作的dom, 存在兼容性问题:标准浏览器:event.target,IE浏览器:event.srcElement, 此时只是获取了当前节点的位置,但并不知道节点名称,这里我们用nodeName来获取具体是什么标签名,这个返回值是一个大写的,判断时需要转换为小写; [javascript]?view plain?copy ?
- window.onload = function(){
- var oTa = document.getElementById("myTable");
- oTa.onclick = function(e){
- var e = e || window.event; //处理兼容性
- var target = e.target || e.srcElement;
- target.nodeName.toLowerCase() == 'td' ? alert('我点中了table') :(target.style.background = 'red'); //三元运算符进行判断
- }
- }
- <!-- 事件绑定 -->
- <table id="myTable" border="1">
- <tr>
- <td id="add">增加</td>
- <td id="delete">删除</td>
- <td id="modfiy">修改</td>
- <td id="select">查找</td>
- </tr>
- </table>
- window.onload = function(){
- var Add = document.getElementById("add");
- var Delete = document.getElementById("delete");
- var Move = document.getElementById("move");
- var Select = document.getElementById("select");
- Add.onclick = function(){
- alert('添加');
- };
- Remove.onclick = function(){
- alert('删除');
- };
- Move.onclick = function(){
- alert('移动');
- };
- Select.onclick = function(){
- alert('选择');
- }
- }
[javascript]?view plain?copy ?
- window.onload = function(){
- var myTable = document.getElementById("myTable");
- myTable.onclick = function (ev) {
- var ev = ev || window.event;
- var target = ev.target || ev.srcElement;
- if(target.nodeName.toLocaleLowerCase() == 'table'){
- switch(target.id){
- case 'add' :
- alert('添加');
- break;
- case 'remove' :
- alert('删除');
- break;
- case 'move' :
- alert('移动');
- break;
- case 'select' :
- alert('选择');
- 再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
内容总结
以上是互联网集市为您收集整理的javascript事件委托理解,jQuery on 方法一步到位实现事件委托全部内容,希望文章能够帮你解决javascript事件委托理解,jQuery on 方法一步到位实现事件委托所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。