JS之事件委托

来源:互联网 发布:window.open js 编辑:程序博客网 时间:2024/06/09 23:04

前段时间去了慕课网面试前端开发,面试官当时问了我一个关于事件委托的问题,当时一脸蒙逼,心里在想什么鬼,好像都没听过啊,后来回来后赶紧查了一下资料,才知道原来事件委托是js中的经典问题啊,当时那个后悔啊,说多了都是泪啊。当时就看了一下事件委托,大致对此有了了解,感觉就懂了事件委托。今天一个师哥去美团面试,又被问到了事件委托的问题,当时听他讲了下问的问题,我的心瞬间崩溃了,还是感觉对此一无所知,所以今天打算在此做一下关于事件委托的总结,以此告诫自己,好记性不如烂笔头啊。

概念:

那什么叫事件委托呢?也叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。看到网上都在用取快递的例子来解释,我也就借花献佛,直接拿过来用了。

有三个同事预计会在周一收到快递。为签收快递,有两种办法:一是三个人在公司门口等快递;二是委托给前台MM代为签收。现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递)。前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款。这种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台MM也会在收到寄给新员工的快递后核实并代为签收。

第一,现在委托前台的同事是可以代为签收的,即程序中的现有的dom节点是有事件的;

第二,新员工也是可以被前台MM代为签收的,即程序中新添加的dom节点也是有事件的。

事件委托原理:

事件委托是利用事件的冒泡原理来实现的,何为事件冒泡呢?就是事件从最深的节点开始,然后逐步向上传播事件,举个例子:页面上有这么一个节点树,div>ul>li>a;比如给最里面的a加一个click点击事件,那么这个事件就会一层一层的往外执行,执行顺序a>li>ul>div,有这样一个机制,那么我们给最外面的div加点击事件,那么里面的ul,li,a做点击事件的时候,都会冒泡到最外层的div上,所以都会触发,这就是事件委托,委托它们父级代为执行事件。


事件委托的好处:

js中,dom需要有事件处理程序,我们都会直接给它设事件处理程序就好了,那如果是很多的dom需要添加事件处理呢?比如我们有100个li,每个li都有相同的click点击事件,可能我们会用for循环的方法,来遍历所有的li,然后给它们添加事件,在JavaScript中,添加到页面上的事件处理程序数量将直接关系到页面的整体运行性能,因为需要不断的与dom节点进行交互,访问dom的次数越多,引起浏览器重绘与重排的次数也就越多,就会延长整个页面的交互就绪时间,这就是为什么性能优化的主要思想之一就是减少DOM操作的原因;如果要用事件委托,就会将所有的操作放到js程序里面,与dom的操作就只需要交互一次,这样就能大大的减少与dom的交互次数,提高性能;

事件委托的实现:



原创粉丝点击