Jquery揭秘系列:谈谈bind,one,live,delegate事件及实现
在Jquery里面,我们用的最多的就是事件绑定了,事件绑定有多个函数。例如:bind,one,live,delegate等等。
我们先看看他们的定义,直接进入主题:
bind( )方法用于将一个处理程序附加到每个匹配元素的事件上并返回jQuery对象。
.bind(eventType[, evnetData], Handler(eventObject))
其中,参数eventType是一个字符串,包含一个或多个javaScript事件类 型,例如click,submit或自定义事件的名称,指定多个事件类型时用空格分隔各个类型;eventData为Map类型,给出要传递给事件处理程 序的数据,handler指定触发该事件时要执行的函数,eventObject表示事件对象。
.bind()方法将事件处理程序handler附加到匹配元素集合中的每个元素的eventType事件上,如果需要,还可以向事件处理程序传递数据。
live( )方法将一个事件处理程序附加到与当前选择器匹配的所有元素(包含现有的或将来添加的)的指定事件上并返回jQuery对象。
.live(eventType,[eventData],handler)
其中,参数eventType是一个字符串,包含一个或多个javaScript事件类 型,例如click,keydown或自定义事件的名称,eventData是可选参数,为Map类型,给出要传递给事件处理程序的数据,该参数是在 jQuery1.4中添加的;handler是一个函数,当触发该事件时将执行这些函数
.live()方法将事件处理程序handler附加到每个匹配元素(包含当前存在的和将来添加的)的eventType事件上,必要时还可以使用参加eventData向事件处理程序传递数据。
.live()方法是基本的.bind()方法的一个变形,后者可以将事件处理程序附加到 元素·,当调用.bind()时,jQuery对象匹配的元素将被附加上事件处理程序,但以后添加的元素并不会被附加该事件处理程序,因此,还需要对这些 元素再次调用.bind()方法。
.one()方法将事件处理程序附加到匹配元素的指定事件并返回jQuery对象。所附加的事件处理程序最多只能执行一次。
.one(eventType,[eventData],handler(eventObject))
其中,参数eventType是一个字符串,包含一个或多个javaScript事件类 型,例如click,submit或自定义事件的名称,指定多个事件类型时用空格分隔各个类型;eventData为Map类型,给出要传递给事件处理程 序的数据,handler指定触发该事件时要执行的函数,eventObject表示事件对象。
.one()方法与.bind()类似,所不同的是,使用.one()绑定的事件处理程序在执行一次之后将自动取消绑定。
.delegate()方法基于一组特定的根元素将处理程序附加到匹配选择器的所有元素(现有的或将来的)的一个或多个事件上。
.delegate(selector,eventType[,eventData],handler)
其中,参数 selector是一个选择器,用于筛选触发事件的元素;eventType是一个字符串,指定一个或多个JavaScript事件类型(多个事件用空格 分隔),例如click,keydown或自定义事件名称;eventData为映射类型,表示要传递给事件处理程序的数据;handler表示触发该事 件时执行的函数。
.delegate()与.live()类似,可将每个事件的绑定委托给指定的DOM元素。
再说说区别:
bind是在dom树加载后,对元素的绑定,属于后期绑定。
one是在dom树加载后,对元素的绑定,和bind一样属于后期绑定,但是会在事件执行之后移除元素的绑定事件,事件只执行一次。
live 是先把事件绑定在document对象上面,通过事件冒泡,判断当前处于目标状态的元素是不是预绑定的那个元素对象,然后执行事件,属于前期绑定,元素可以是已存在的,也可以是动态添加的。
delegate绑定的元素可以是已经存在的,也可以是动态添加的。如果是已经存在的就会选定一个父元素,通过冒泡来触发指定子元素的事件。如果是动态添加的,就以document为父元素来触发冒泡事件。
- (注:这里所说的后期绑定指的是元素已经加载后,进行事件的绑定。前期绑定指的是元素尚未存在,为动态元素添加事件)
这几种方法推荐使用bind和delegate,因为live是绑定事件在document上面,然后通过冒泡查询元素执行事件,很耗性能。
它们的原生js实现 :

(function (context) {
var _$ = function (selector) {
return new _$.prototype.Init(selector);
}
_$.prototype = {
Init: function () {
var arr = Array.prototype.slice.call(arguments);
if (arr.length > 0)
{
if (typeof arr[0] == "string") {
this.element = document.getElementById(arr[0]);
}
else if (Object.prototype.toString.call(arr[0])=="object Object") {
this.element = arr[0];
}
}
},
bind: function (type, fn) {
if (this.element) {
if (document.addEventListener) {
this.element.addEventListener(type, fn, false);
}
else if (document.attachEvent) {
this.element.attachEvent('on' + type, fn);
}
else {
this.element['on' + type] = fn;
}
}
},
unbind: function (type, fn) {
if (this.element) {
if (document.removeEventListener) {
this.element.removeEventListener(type, fn, false);
}
else if (document.attachEvent) {
this.element.detachEvent('on' + type, fn);
}
else {
this.element['on' + type] = null;
}
}
},
one: function (type, fn) {
var self = this;
if (this.element) {
if (document.addEventListener) {
this.element.addEventListener(type, function () {
self.element.removeEventListener(type, arguments.callee, false);
fn();
}, false);
}
else if (document.attachEvent) {
this.element.attachEvent('on' + type, function () {
self.element.detachEvent('on' + type, arguments.callee);
fn();
});
}
else {
this.element['on' + type] = function () {
self.element['on' + type] = null;
fn();
};
}
}
},
live: function (type, fn) {
var self = this;
if (document.addEventListener) {
document.addEventListener(type, function (e) {
var evt = e || window.event;
var target = evt.srcElement || evt.target;
if (target.id == self.element.id) {
fn();
}
}, false);
}
else if (document.attachEvent) {
document.attachEvent('on' + type, function (e) {
var evt = e || window.event;
var target = evt.srcElement || evt.target;
if (target.id == self.element.id) {
fn();
}
});
}
else {
document['on' + type] = function (e) {
var evt = e || window.event;
var target = evt.srcElement || evt.target;
if (target.id == self.element.id) {
document['on' + type] = null;
fn();
}
};
}
},
delegate: function (flag, type, fn) {
var self = this;
if (document.addEventListener) {
self.element.addEventListener(type, function (e) {
var evt = e || window.event;
var target = evt.srcElement || evt.target;
if (target.tagName.toLowerCase() == flag) {
fn();
}
}, false);
}
else if (document.attachEvent) {
self.element.attachEvent('on' + type, function (e) {
var evt = e || window.event;
var target = evt.srcElement || evt.target;
if (target.tagName.toLowerCase() == flag) {
fn();
}
});
}
else {
self.element['on' + type] = function (e) {
var evt = e || window.event;
var target = evt.srcElement || evt.target;
if (target.tagName.toLowerCase() == flag) {
fn();
}
};
}
}
}
_$.prototype.Init.prototype = _$.prototype;
context.$ = _$;
})(window);

这里就是一些兼容性代码,阅读起来没啥难度,如果有描述不清楚的地方,可以留言。
Jquery揭秘系列:谈谈bind,one,live,delegate事件及实现的更多相关文章
- Jquery揭秘系列:Validation实现
之前讲了一部分揭秘系列的东西,由于年初的时候在改项目,也没有写下去.现在开始闲下来了,会继续写没写完的东西,各种原生js实现Jquery的功能. 转入正题,说一下今天要讲的东西. 相信很多tx在项目里 ...
- jQuery的三种bind/One/Live/On事件绑定使用方法
本篇文章介绍了,关于jQuery新的事件绑定机制on()的使用技巧.需要的朋友参考下 今天浏览jQuery的deprecated列表,发现live()和die()在里面了,赶紧看了一下,发现从jQ ...
- Jquery揭秘系列:谈谈bind,one,live,delegate,on事件及实现
在Jquery里面,我们用的最多的就是事件绑定了,事件绑定有多个函数.例如:bind,one,live,delegate,on等等. on() jQuery事件绑定.on()简要概述及应用 看源码发现 ...
- Jquery揭秘系列:实现 ready和bind事件
讲这一节之前,先回顾之前的一篇<小谈Jquery>里面的代码: (function (win) { var _$ = function (selector, context) { retu ...
- Jquery揭秘系列:实现$.fn.extend 和$.extend函数
前面我们扩展了bind方法和ready函数,这次我要讲一下$.fn.extend 和$.extend函数. 其他的不多说,直接切入主题吧! 先来看看这两个函数的区别: $.fn.extend是为查询的 ...
- Jquery揭秘系列:ajax原生js实现
讲到ajax这个东西,我们要知道两个对象XMLHTTPRequest和ActiveXObject ,提供了对 HTTP 协议的完全的访问,包括做出 POST 和 HEAD 请求以及普通的 GET 请求 ...
- jQuery方法区别:click() bind() live() delegate()区别
今天看到一篇jquery 事件的文章,自己写了个小例子,虽然2种方式都可以实现,但是不太明白,找了点资料 $("#box1").delegate("p",&qu ...
- Jquery中bind(), live(), on(), delegate()四种注册事件的优缺点,建议使用on()
jquery中注册的事件,注册事件很容易理解偏差,叫法不一样.我第一反应就是如何添加事件,使用onclick之类的,暂时不讨论js注册事件的方法. 也看到园内前辈写过相关的帖子,但不是很详细,我找到了 ...
- jQuery中的bind(), live(), on(), delegate()
当我们试图绑定一些事件到DOM元素上的时候,我相信上面这4个方法是最常用的.而它们之间到底有什么不同呢?在什么场合下用什么方法是最有效的呢? 准备知识: 当我们在开始的时候,有些知识是必须具备的: D ...
随机推荐
- Java Web解决解析乱码和响应乱码
package cn.edu.aynu.rjxy.servlet; import java.io.IOException; import java.io.PrintWriter; import jav ...
- python头部注释 vim添加头部注释
1.先说说python和virtual python 一般环境下,python解释器会放在/usr/bin/ 下面,然后你执行python的时候就会运行了,但是如果没有在/usr/bin/下面的话,执 ...
- CRLF line terminators导致shell脚本报错:command not found
Linux和Windows文本文件的行结束标志不同.在Linux中,文本文件用"/n"表示回车换行,而Windows用"/r/n"表示回车换行.有时候在Wind ...
- Oracle常用语句集合
oracle常用经典SQL查询 常用SQL查询: .查看表空间的名称及大小 )),) ts_size from dba_tablespaces t, dba_data_files d where t. ...
- Oracle表的几种连接方式
1,排序 - - 合并连接(Sort Merge Join, SMJ) 2,嵌套循环(Nested Loops, NL) 3,哈希连接(Hash Join, HJ) Join是一种试图将两个表结合在一 ...
- SpringMVC 文件上传
@RequestMapping("/testFileUpload") public String testFileUpload(@RequestParam("desc&q ...
- 关于Java中枚举Enum的深入剖析
在编程语言中我们,都会接触到枚举类型,通常我们进行有穷的列举来实现一些限定.Java也不例外.Java中的枚举类型为Enum,本文将对枚举进行一些比较深入的剖析. 什么是Enum Enum是自Java ...
- PyCharm创建virtualenv方法
Python的版本众多,在加上适用不同版本的Python Package.这导致在同时进行几个项目时,对库的依赖存在很大的问题.这个时候就牵涉到对Python以及依赖库的版本管理,方便进行开发,vir ...
- Fedora 23安装配置mysql数据库,修改初始密码及登陆
下载MySQL5.7.9 yum仓库 wget http://dev.mysql.com/get/mysql57-community-release-fc23-7-noarch.rpm rpm -iv ...
- C语言猜拳游戏
2016年最后一篇文章 今天闲来无事Google了一段C语言写的猜拳游戏的代码(本人水平比较低,几乎是刚入门),我没做什么修改.这个switch语句里面对result的处理让我眼前一新,原来是这么玩的 ...