2019独角兽企业重金招聘Python工程师标准>>>

今天在公司,有个需求是,通过ajax动态查询数据,回来,再添加到一个ul的li元素中,例如(点击生成 li 模拟,加载数据生成相应的数据, 事件: 点击):

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Document</title><script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
</head>
<body><button>create</button><ul id="parent"><li class="son-1">Item 1</li><li class="son-2">Item 2</li></ul><script>$(function () {$('button').on('click', function (e) {$('#parent').append('<li>add</li>')});});</script>
</body>
</html>

平时自己的添加事件:

$('#parent li').on('click', function (e) {alert('这是第' + $(this).index() + 'li');
});

这样子可以为,dom元素中已经经过渲染的li元素绑定事件,如果点击 craete按钮新生成的li元素,由于,事件绑定的js已经执行完毕,所以无法对新生成的li进行事件的绑定。一开始,在没有用jq的事件委托,自己简单的粗暴的对新生的元素,再一次动态绑定:

//在生成新生元素后, 再次执行这段 函数 ,绑定需要的事件。
$('#parent li').on('click', function (e) {alert('这是第' + $(this).index() + 'li');
});

明显是很挫的做法,不仅不易维护,而且性能也大打折扣,因为这样虽然会为新的元素绑定到事件,但是已经存在的元素也会再次绑。

jq提供的事件委托,可以很有效的解决这种问题。delegate 和 on 都提供了相应的方法

$('#parent').delegate('li', 'click', function(event) {console.log($(this))
});
$('#parent').on('click', 'li', function (e) {console.log($(this))
});

这两个函数均可提供相应的效果,个人更倾向于使用 on :

下面是从jq的api copy过来的使用文档:

on(events,[selector],[data],fn)

概述

在选择元素上绑定一个或多个事件的事件处理函数。

on()方法绑定事件处理程序到当前选定的jQuery对象中的元素。在jQuery 1.7中,.on()方法 提供绑定事件处理程序所需的所有功能。帮助从旧的jQuery事件方法转换,see .bind(), .delegate(), 和 .live(). 要删除的.on()绑定的事件,请参阅.off()。要附加一个事件,只运行一次,然后删除自己, 请参阅.one()

参数

events,[selector],[data],fnV1.7

events:一个或多个用空格分隔的事件类型和可选的命名空间,如"click"或"keydown.myPlugin" 。

selector:一个选择器字符串用于过滤器的触发事件的选择器元素的后代。如果选择的< null或省略,当它到达选定的元素,事件总是触发。

data:当一个事件被触发时要传递event.data给事件处理函数。

fn:该事件被触发时执行的函数。 false 值也可以做一个函数的简写,返回false。

events-map,[selector],[data]V1.7

events-map:个用字符串表示的,一个或多个空格分隔的事件类型和可选的命名空间,值表示事件绑定的处理函数。

selector:一个选择器字符串过滤选定的元素,该选择器的后裔元素将调用处理程序。如果选择是空或被忽略,当它到达选定的元素,事件总是触发。

data:当一个事件被触发时要传递event.data给事件处理函数。

javascript也有原生的事件委托

DEMO:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Document</title>
</head>
<body><input type="button" id="btn" /><ul id="ul"><li>aaaaaaaa</li><li>bbbbbbbb</li><li>cccccccc</li></ul><script>window.onload = function(){var oUl = document.getElementById("ul");var aLi = oUl.getElementsByTagName("li");var oBtn = document.getElementById("btn");var iNow = 4;oUl.onmouseover = function(ev){var ev = ev || window.event;var target = ev.target || ev.srcElement;if(target.nodeName.toLowerCase() == "li"){alert('触发了')}}oUl.onmouseout = function(ev){var ev = ev || window.event;var target = ev.target || ev.srcElement;if(target.nodeName.toLowerCase() == "li"){alert('触发了')}}oBtn.onclick = function(){iNow ++;var oLi = document.createElement("li");oLi.innerHTML = iNow;oUl.appendChild(oLi);}}</script>
</body>
</html>

从原生的js中可以看出:事件委托是通过,事件的冒泡。实现的。通过子元素的点击事件,冒泡到父元素,父元素再通过event的内容判断 为该元素触发相应的事件, 在demo中的,获取对应的 tagName 判断子元素 是不是 li。是的话触发对应的事件,从而 达到事件的委托。

转载于:https://my.oschina.net/xbuding/blog/667168

javascript和jq的事件委托相关推荐

  1. 【译】JavaScript面试问题:事件委托和this

    JavaScript不仅门槛低,而且是一门有趣.功能强大和非常重要的语言.各行各业的人发现自己最混乱的选择是JavaSscript编程语言.由于有着各种各样的背景,所以不是每个人都对JavaScrip ...

  2. JavaScript面试问题:事件委托和this

    JavaScript不仅门槛低,而且是一门有趣.功能强大和非常重要的语言.各行各业的人发现自己最混乱的选择是JavaSscript编程语言.由于有着各种各样的背景,所以不是每个人都对JavaScrip ...

  3. JQ 为未来元素添加事件处理器—事件委托

    随着DOM结构的复杂化和Ajax等动态脚本技术的运用,有了较多的动态添加进来的元素,直接用JQ添加click事件会发现新添加进来的元素并不能直接选取到,在这里就需要用到事件委托方法,JQ为事件委托提供 ...

  4. 前端-【学习心得】-事件委托方法

    上篇分享提出的这个事件委托,今天让我来详细说明下把. 先看一段例子: <!DOCTYPE html> <html> <head> <meta charset= ...

  5. js原生事件委托写法,jquery事件委托写法

    什么是事件委托: 事件委托--给父元素绑定事件,用来监听子元素的冒泡事件,并找到是哪个子元素的事件.(不理解冒泡的可以去百度下) 定义: 利用事件冒泡处理动态元素事件绑定的方法,专业术语叫事件委托. ...

  6. 事件委托技术原理和使用(js,jquery)

    事件委托技术原理和使用(js,jquery) 原创 2016年03月10日 11:18:56 标签: 技术 / jquery / javascript 2555 一:事件委托技术原理 摘自http:/ ...

  7. 关于事件委托的整理 ,另附bind,live,delegate,on区别

    随着DOM结构的复杂化和Ajax等动态脚本技术的运用导致如今的js界里最火热的一项技术应该是'事件委托(event delegation)'了,什么是事件委托呢?小七给你娓娓道来,说白了就是想给子元素 ...

  8. JavaScript:事件冒泡和事件委托

    2019独角兽企业重金招聘Python工程师标准>>> JavaScript事件代理和委托(Delegation) JavaScript事件冒泡和事件委托 JavaScript:通过 ...

  9. Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制

    一.事件的捕获与冒泡 由W3C规定的DOM2标准中,一次事件的完整过程包括三步:捕获→执行目标元素的监听函数→冒泡,在捕获和冒泡阶段,会依次检查途径的每个节点,如果该节点注册了相应的监听函数,则执行监 ...

最新文章

  1. 有存款,才能过得更踏实
  2. 【性格心理学】为什么我在关键时刻总是紧张?
  3. 从微博的改版谈网页重构——bigpipe中的页面构建优化
  4. 计算机办公应用适合什么工作,有什么软件堪称办公神器,让你每天的工作轻松不累?...
  5. mysql connector安装教程_通过安装MySQL Connector/Net实现VS2017 C#编程连接MySQL数据库-网络教程与技术 -亦是美网络...
  6. bugzilla perl mysql apache windows,windows下apache安装bugzilla
  7. mysql数据库连接_mysql数据库连接池配置教程
  8. 控制HTML Input只能输入数字和小数点
  9. Hibernate Tomcat JNDI数据源示例教程
  10. TLB cache 原理
  11. linux之vmlinux、vmlinuz、System.map和/proc/kallsyms简介
  12. python爬取网易云音乐付费音乐_python爬虫学习教程,爬取网易云音乐!
  13. 网络驱动器无法访问,提示找不到网络路径故障处理过程
  14. ListView优化的
  15. 从数据结构的角度来看Mysql为什么使用B+树
  16. 计算机维修志愿活动策划书,“义务维修,温暖校园”志愿服务活动策划书
  17. 阿里巴巴、百度前端工程师 2015 暑期实习生面试经历
  18. 一下科技:未来短视频行业发展呈四大趋势
  19. IDL和MATLAB读取grib数据
  20. 宝塔安装Jdk1.8

热门文章

  1. Xen 和 KVM 下如何关闭 virbr0
  2. 微软虚拟学院开学了!
  3. 用VirtualBox在XP环境下虚拟Ubuntu的过程
  4. 未来的全能保姆机器人作文_保姆机器人作文500字
  5. webp的js插件_让浏览器全面兼容WebP图片格式
  6. 二极管ss14测量_各种常用二极管的检测方法
  7. 简单介绍CentOS6升级glibc操作步骤
  8. java 校验姓名只能包含中英文_java代码验证用户名,支持中英文(包括全角字符)、数字、下划线和减号 (全角及汉字算两位),长度为4-20位,中文按二位计数...
  9. mysql截取不含%_zp blog
  10. 【初识Java】 -- Java的数据类型与运算符