事件托付事实上并非一个非常高级的技巧,比方在一个页面里面。当仅仅存在两个button的时候。可能你给button加入监听是这种:(本文不考虑浏览器兼容性。关于事件的兼容性可參考前面的学习笔记)

<div id="container">
<button id="btn1">button1</button>
<button id="btn2">button2</button>
</div>
var btn1 = document.getElementById("btn1");
var btn2 = document.getElementById("btn2");
btn1.addEventListener("click", clickHandler1);
btn2.addEventListener("click", clickHandler2);

当button越来越多的时候。甚至到了几十上百的时候。我相信非常少有人会选择一个一个的加入事件,首先。事实上事件处理函数每一个都是对象,都会占用内存,创建的越多。内存开销越大,性能越差;其次。大量“反复”性的代码拥挤在脚本里,非常难以维护,也非常难看。还有。加入大量监听意味着要频繁訪问DOM元素,延迟整个页面的訪问时间。

事件托付就是解决问题的一个方案。

我们知道。在DOM节点构成的DOM树中,子节点产生一个事件之后会逐级冒泡到父元素上:



事件托付就利用这一特性。仅仅需给全部的button的父元素比方container加入一个事件,这样无论是哪个button,仅仅要触发了绑定的事件都会冒泡到container上,我们仅仅需推断是不是你想监听的button就可以。

var container = document.getElementById("container");
container.addEventListener("click", function(e){
//获取事件触发对象
var target = e.target;
if(target.id == "btn1"){
alert("btn1");
}else if(target.id == "btn2"){
alert("btn2");
}
});

这种方法另一个明显的优点是你不必再问以后创建的元素加入监听。

比方在上面的推断里加入

else if(target.id == "btn3"){
alert("btn3");
}

加入这个事件处理程序的时候页面中还并没有btn3,但btn3非常可能是由用户动态创建的,但无论用户什么时候创建,你都能在这个条件里捕获它。

JQuery里面的事件托付

事实上在JQuery里。由于非常easy创建一个JQuery集合。所以处理事件相对简单。

一、click函数、bind函数等:

$("a").click(function(){
if($(this).hasClass("a1")){
//...
}else if(...){
//...
}
}); $("a").bind("click", function(){
if($(this).hasClass("a1")){
//...
}else if(...){
//...
}
});

事实上这种方法相同也是通过遍历全部a标签,给他们加入事件函数。但比原生js代码量要少非常多。

二、live()

live和上面讲的原生js相似。不指定父元素的时候,将事件绑定在了document上,比方:

$(".link").live("click", function(){
//...
});

当有事件冒泡到document上时。将检查事件是否为click事件,元素是否带有link的className。满足这两个条件则将触发事件处理函数。

除了默认绑定在document上。也能够绑定在指定父元素上:

$(".link", $("#container")).live("click", function(){
//...
});

三、delegate

事实上无论是live还是bind,他们的写法都非常奇怪,我们讨论的事件托付都是给父元素加入的事件监听,但一直到如今都好像是在子元素上调用的方法。只是还好JQuery里面另一个函数:delegate。

相同是绑定事件到.link筛选条件上,使用delegate方法例如以下:

$("#container").delegate(".link", "click", function(){
//...
});

能够看到,我们在须要绑定的父元素(id名为container的元素)上调用的delegate方法,并传递三个參数:监听元素筛选条件、监听事件名、事件处理函数。

通过链式调用更加舒服:

$("#container").delegate(".link", "click", function(){
//...
}).delegate(".btn", "click", function(){
//...
}).delegate(".whatever", "click", function(){
//...
});

注意

bind是不能为后面动态生成的元素绑定事件的(由于调用bind时遍历的是当时页面里的全部元素)。

live和delegate是能够为动态生成的元素触发事件处理函数的,由于绑定在父元素上的仅仅是一个筛选条件。

最后须要注意的是相同是绑定在document元素上的click事件:

$(".btn").live("click", function(){
//...
}); $("document").delegate(".btn", "click", function(){
//...
});

最好使用delegate方法,由于尽管live相同是绑定在document上。但$(“.btn”)这句代码还是会遍历全部的.btn元素并给其创建JQuery对象,相比于直接使用document,性能上会有所不如。

当然。就拿写法来说,我们也更应该喜欢delegate方法。

JS和JQuery中的事件托付 学习笔记的更多相关文章

  1. jQuery中的事件与动画 笔记整理

    一. jQuery中的事件 jQuery事件是对javaScript事件的封装. 1.基础事件 在javaScript中,常用的基础事件有鼠标事件.键盘事件.window事件.表单事件.事件的绑定和处 ...

  2. JS和jQuery中的事件总结(一)

    学而时习之,小白现在天天写页面,基础知识还是要恶补的. 进入正题,什么是事件(此处单独对jQuery.JS)?就是JS和Html之间的交互时呢,用户和浏览器操作页面时的动作(其实是为引发的效果的执行操 ...

  3. js和jQuery中的事件绑定与普通事件

    普通事件,是指直接对元素进行事件注册,然后触发 而事件绑定是将事件注册到元素上 两者区别就是在于普通事件不可以重复添加多个事件,若添加也会覆盖,只会触发其中一个事件(最后注册的那个) 而事件绑定是可以 ...

  4. js和jquery中的事件委托

    [转+自己的修改] 概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却 ...

  5. zepto.1.1.6.js源码中的each方法学习笔记

    each方法接受要遍历的对象和对应的回调函数作为参数,它的作用是: 1.如果要遍历的对象是类似数组的形式(以该对象的length属性值的类型是否为number类型来判断),那么就把以要遍历的对象为执行 ...

  6. jQuery学习笔记(三)jQuery中的事件

    目录 加载DOM 事件绑定 合成事件 事件冒泡 移除事件 一.加载DOM Javascript 与HTML之间的交互是通过用户操作浏览器页面引发的事件来处理的.jQuery提供了丰富的事件处理机制.从 ...

  7. 【jQuery基础学习】03 jQuery中的事件与动画

    关于jQuery中的事件 js与HTML之间的交互是通过用户和浏览器操作页面时引发的事件来处理的. jQuery增加并扩展了基本的事件处理机制,jQuery不仅提供了更加优雅的事件处理方法,而且极大地 ...

  8. Javascript事件模型系列(三)jQuery中的事件监听方式及异同点

    作为全球最知名的js框架之一,jQuery的火热程度堪称无与伦比,简单易学的API再加丰富的插件,几乎是每个前端程序员的必修课.从读<锋利的jQuery>开始,到现在使用jQuery有一年 ...

  9. Jquery中的事件和动画

    在学习Jquery中的过程中我们绝大部分都用到了事件的操作,也可以说事件是Jquery中必不可少的一部分,我们常见的一些事件有单击事件,鼠标事件,键盘事件等等.在Jquery中的学习中为了能使让页面以 ...

随机推荐

  1. Javascript判断数据类型与真假值隐形转换研究

    一.引言 我们在开发的时候经常要判断真和假,这是我们经常写的代码: if(a){ alert(1) } 那我们怎么判定a是真还是假呢?下面这些值的真假又是多少呢?它们的数据类型又是怎样的呢? &quo ...

  2. 采用Vue2.0开发的分页js组件

    2017-11-17 19:14:23 基于jQuery的分页插件相信大家伙已经都用过很多了,今天分享一下基于Vue2.0的分页插件pagination.js 由于项目需求,要求使用 Vue2.0 开 ...

  3. [转载] NoSQL简介

    摘自“百度百科”. NoSQL,泛指非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从 ...

  4. Tomcat多域名访问

    对于域名解析相信很多小伙伴都了解过,就是我们在万网购买一个域名,比如hpugs.com,然后呢?我们希望域名与我们的服务器绑定,然后通过域名直接访问我们的项目,这就是本篇要和大家一起探讨的问题.下面开 ...

  5. JAVA基础2——类初始化相关执行顺序

    类初始化相关执行顺序 几个概念说明 代码块的含义与作用 static静态代码块: 一般用于初始化类中的静态变量.比如:给静态的数组或者list变量赋初值.使用static静态代码块进行初始化与直接在定 ...

  6. Qt---Xml文件解析

    本文我们通过一个读取Xml文件的小例子来学习QXmlStreamReader. Xml 简介 Xml的全称是可扩展标记语言(EXtensible Markup Language),同HTML一样是一种 ...

  7. 用lua+redis实现一个简单的计数器功能 (二)

    环境已经搭建完毕 传送门 计数方案 就目前来看nginx是最快的服务 我在设计方案时选择信任redis作为存储库,不做穿透处理,由于目前redis集群方案还不成熟,只在这里做了主备方案.想做集群方案的 ...

  8. 集合、set以及HASH

    集合的数据结构数据结构就是内存中保存输出数据的形式,不同的数据结构会有不同的特征.堆栈结构:先进后出 代表类(stack):应用场景:java中的方法运行时所占用的空间就是这种结构.队列结构:先进先出 ...

  9. UITextField的使用小技巧

    [tf setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];//修改placeHolder ...

  10. cinder控制节点集群

    #cinder控制节点集群 openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html #cinder块存储控制节点.txt.s ...