参考: jQuery代码优化:事件委托篇

使用该技术能让你避免对特定的每个节点添加事件监听器;相反,事件监听器被添加在他们的父元素上,事件监听器会分析从子元素上冒泡上来的事件,并找到是哪个子元素事件。

现实当中,前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款。(公司也不会容忍那么多员工站在门口就为了等快递);

这种事件委托还有个好处,就是即便公司又来很多员工,前台MM照样可以签收新员工的快递,新员工即便刚来但一样拥有拿自己快件的方法;

通俗来讲: 事件有:onclick、onmouseover、onmouseout等等;委托呢,就是让别人来做,这件事情本身是加在元素上,然而你却加载别人身上来做,完成事件;

原理:

利用冒泡原理,将事件加在父级上触发,执行效果;

好处:

  1. 提高性能
  2. 新添加元素,可以直接拥有事件;

事件源 :

跟this作用一样(他不用看指向问题,谁操作的就是谁),event对象下的

使用情景:

  * 为DOM中的很多元素绑定相同事件;

  * 为DOM中尚不存在的元素绑定事件;

栗子:

需要触发每个li来改变他们的背景颜色

  1. <ul id="ul">
  2. <li>111111111</li>
  3. <li>22222222222</li>
  4. <li>33333333</li>
  5. <li>44444444444</li>
  6. </ul>

js一般写法:

  1. window.onload = function(){
  2. var oUl = document.getElementById('ul');
  3. var aLi = oUl.getElementsByTagName('li');
  4. for(var i=0; i<aLi.length; i++){
  5. aLi[i].onmouseover = function(){
  6. this.style.background = 'red';
  7. }
  8. aLi[i].onmouseout = function(){
  9. this.style.background = ' ';
  10. }
  11. }
  12. }

事件委托的js写法:

  1. window.onload = function(){
  2. var oUl = document.getElementById('ul');
  3. var aLi = oUl.getElementsByTagName('li');
  4. /*这里用到事件源:event对象, 事件源,不管在哪个事件中,只要你操作的那个元素就是事件源
  5. ie: window.event.srcElent
  6. 标准下: event.target
  7. nodeName: 找到元素的标签名;
  8. */
  9. oUl.onmouseover = function(ev) {
  10. var ev = ev||window.event;
  11. var target = ev.target || ev.srcElement;
  12. // console.log(target.innerHTML);
  13. if(target.nodeName.toLowerCase() == "li"){
  14. target.style.background = 'red';
  15. }
  16. }
  17. oUl.onmouseout = function(ev) {
  18. var ev = ev || window.event;
  19. var target = ev.target|| ev.srcElement;
  20. if(target.nodeName.toLowerCase() == 'li'){
  21. target.style.background = ' ';
  22. }
  23. }
  24. }

事件委托的jq写法

  1. $(function(){
  2. $("#ul").on('click','li',function(){
  3. if(!$(this).attr('s')){
  4. $(this).css('background','red');
  5. $(this).attr('s',true);
  6. }else{
  7. $(this).css('background','#fff');
  8. $(this).removeAttr('s');
  9. }
  10. })
  11. })

还有一种使用delegate()方法代替on() ; 现多不用 ,用法同on,只是参数顺序有变...delegate('li','click',function(){...})...

js事件委托篇(附js一般写法和js、jq事件委托写法)的更多相关文章

  1. JQ写法和js写法 方法函数化

    <script> $(function () { $('#head').click=function () { alert($(this).html()) } }) </script ...

  2. 鼠标放上时显示隐藏的div或者其他代码的“jquery”的三种写法和“JavaScript”的一种写法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 手写Koa.js源码

    用Node.js写一个web服务器,我前面已经写过两篇文章了: 第一篇是不使用任何框架也能搭建一个web服务器,主要是熟悉Node.js原生API的使用:使用Node.js原生API写一个web服务器 ...

  4. Backbone.js之model篇(一)

    Backbone.js之model篇(一) Backbone 是一个前端 JS 代码 MVC 框架,它不可取代 Jquery,不可取代现有的 template 库.而是和这些结合起来构建复杂的 web ...

  5. 使用Xcode IDE写node.js

    最近在玩node.js 但是发现很多IDE就是用不顺手 后来发现Xcode可以剖析java script 于是试着使用Xcode来当做node.js的编辑器 首先,在Mac上必须先安装node.js的 ...

  6. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...

  7. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...

  8. JavaScript之事件委托(附原生js和jQuery代码)

    事件委托的原理依赖于事件冒泡,可以通过给父元素的事件委托来确定是哪个子元素触发了事件从而做一系列操作. 使用事件委托的优点 1.操作子元素时不用一一遍历,可以根据事件触发的对象而进行相应操作 dom结 ...

  9. Js - JQ事件委托( 适用于给动态生成的脚本元素添加事件)

    最近一段时间打了一个大仗,现在总算消停点,才有时间来做个总结吧算是: 移动端遇到一个项目,是一个列表的侧滑栏,在我这里用jq写的交互事件.自测各方面都挺好的,美滋滋的给了研发.研发也美滋滋的开始开发. ...

随机推荐

  1. ajax请求加全局loading , 个别特殊请求不显示loading

    项目中,请求开始前加载loading遮罩层,请求结束关闭遮罩,一般都会加在全局中,但有个别请求不需要加全局loading 的话,这时候就需要对这些请求进行配置 全局加loading: ; functi ...

  2. python--常用的十进制、16进制、字符串、字节串之间的转换

      进行协议解析时,总是会遇到各种各样的数据转换的问题,从二进制到十进制,从字节串到整数等等 整数之间的进制转换: 10进制转16进制: hex(16)  ==>  0x10 16进制转10进制 ...

  3. Apache mahout 源码阅读笔记-DataModel之UserBaseRecommender

    先来看一下使用流程: 1)拿到DataModel 2)定义相似度计算模型 PearsonCorrelationSimilarity 3)定义用户邻域计算模型 NearestNUserNeighborh ...

  4. 爬虫之urllib包以及request模块和parse模块

    urllib简介 简介 Python3中将python2.7的urllib和urllib2两个包合并成了一个urllib库 Python3中,urllib库包含有四个模块: urllib.reques ...

  5. Python 开发中高级技巧

    列表推导式 >>> chars = [ c for c in 'python' ] >>> chars ['p', 'y', 't', 'h', 'o', 'n'] ...

  6. docker-compose部署zk集群、kafka集群以及kafka-manager,及其遇到的问题和解决

    zk集群docker-compose.yml 1.新建网络 docker network create --driver bridge --subnet --gateway 172.23.0.1 zo ...

  7. Mac 升级 OpenSSL

    [转载自 https://blog.csdn.net/focusjava/article/details/51179297 ] [升级Mac的openssl] 终端下 openssl version ...

  8. win下如何解决在chrome的同源访问问题

    引子:本来是想验证如果在网页中包含多个框架,那么就会存在两个以上的不同全局环境,如果从一个框架引用另一个框架的数据比如数组a,那么用 instanceof 判断这个数组a是不是另个框架Array的实例 ...

  9. 素数判断 - C语言实现

    除了1和自身之外不能整除其它数, 称之为素数. 最小的素数是2. 没有最大的素数. 1000以内素数, 如下图所示: 关于素数的算法, 一般有2种. 第1种, 给出一个数n(n >= 2), 判 ...

  10. jmeter接口测试实战

    请求方法:get/post 接口请求地址:http://172.22.24.26:8080/fundhouse/external/getdata?name=xxxx &fund_udid=35 ...