一:什么是事件委托?

事件委托是利用事件冒泡,只指定一个事件处理程序来管理某一类型的所有事件。

事件委托就是利用事件冒泡原理实现的!
事件冒泡:就是事件从最深节点开始,然后逐步向上传播事件;
例:页面上有一个节点树,div > ul  > li  >  a
比如给最里面的a 加一个click 事件,那么事件就会一层一层的往外执行,执行顺序 a > li > ul > div,  有这样一个机制,当我们给最外层的div 添加点击事件,那么里面的ul , li  , a  做点击事件的时候,都会冒泡到最外层的div上,所以都会触发,这就是事件委托,委托他们父集代为执行事件;
 
什么是事件冒泡?
js所谓的事件冒泡就是子级元素的某个事件被触发,它的上级元素的该事件也被递归执行,jQuery中的事件委托就是用的冒泡。
 

二:为什么要用事件委托?

1.在JavaScript中添加到页面上的事件处理程序的个数直接关系到页面的整体运行性能。为什么呢?因为,每个事件处理函数都是对象,对象会占用内存,内存中的对象越多,性能就越差。此外,必须事先指定所有的事件处理程序而导致的DOM访问次数,会延迟整个页面的交互就绪时间。

2.对有很多个数据的表格以及很长的列表逐个添加事件,简直就是噩梦。所以事件委托,能极大地提高页面的运行性能,减少开发人员的工作量。

三:JavaScript中的例子

我们以下面的HTML代码为例,用事件委托的方式实现当鼠标单击某个li元素的时候,li元素的背景变成红色。

<ul id = "lists">
  <li>列表1</li>
  <li>列表2</li>  
  <li>列表3</li>  
  <li>列表4</li>
</ul> 1 var lists = document.getElementById("lists");
2
3 lists.addEventListener("click",function(event){
4
5 var target = event.target;
6 //防止父元素ul也触发事件
7 if(target.nodeName == "LI"){
8 target.style.backgroundColor = "red";
9 }
10 })  jQuery中的事件委托方式比较丰富,就以同样的例子来说:
   1、用on方法
 $("#lists").on("click","li",function(event){
3 var target = $(event.target);
4 target.css("background-color","red");
5 }) 2.用delegate()方法
$("#lists").delegate("li","click",function(event){
3 var target = $(event.target);
4 target.css("background-color","red");
5 }) 3.用bind()方法
$("#lists").bind("click","li",function(event){
3 var target = $(event.target);
4 if(target.prop("nodeName")=="LI"){
5 target.css("background-color","red");}
6 })
 
live和bind区别:
bind方法只能给当前存在的元素绑定事件,对于事后采用JS等方式新生成的元素无效,而live方法则正好弥补了bind方法的这个缺陷,它可以对后生成的元素也可以绑定相应的事件

最新文章

  1. 让mysql不能为空的字段为空时也能插入
  2. Mysql主从配置,实现读写分离
  3. iOS相关笔记
  4. HTML &lt;!DOCTYPE&gt; 标签 布局引用的几种方法 行级元素与块级元素
  5. jstl 的应用 java
  6. Android中通过导入静态数据库来提高应用第一次的启动速度
  7. 9. Android框架和工具之 SlidingMenu(抽屉菜单)
  8. vc实现ping
  9. struts1 工作原理
  10. Silverlight学习笔记之页面跳转
  11. MyEclipse中将项目导出jar包,以及转化成EXE文件
  12. C# 经典入门12章-System.Collections.Generic命名空间
  13. zip 安装mysql 和遇到的坑
  14. 【数论线性筛】洛谷P1865 A%B problem
  15. mkdir与mkdirs的区别
  16. centos7防火墙导致不能访问的
  17. shell(1)
  18. redis初使用
  19. Maven 添加jdk编译插件
  20. notepad快捷键大全

热门文章

  1. easyui 之表单验证
  2. Git 学习笔记(三)
  3. 修改WebAPI路由控制访问
  4. Five Invaluable Techniques to Improve Regex Performance
  5. Android 强制软键盘关闭
  6. 使用BigDecimal完成小数点后的精确位数的四舍五入
  7. markdown写作软件推荐
  8. 关于C++程序运行程序是出现的this application has requested the runtime to terminate it in an unusual way. 异常分析
  9. Pyhton学习——Day23
  10. Mysql字段合并