on(type, callback)

定义和用法

on() 方法在被选元素及子元素上添加一个或多个事件处理程序。

自 jQuery 版本 1.7 起,on() 方法是 bind()、live() 和 delegate() 方法的新的替代品。该方法给 API 带来很多便利,我们推荐使用该方法,它简化了 jQuery 代码库。

注意:使用 on() 方法添加的事件处理程序适用于当前及未来的元素(比如由脚本创建的新元素)。

提示:如需移除事件处理程序,请使用 off() 方法。

提示:如需添加只运行一次的事件然后移除,请使用 one() 方法。


语法

$(selector).on(event,childSelector,data,function)

参数 描述
event 必需。规定要从被选元素移除的一个或多个事件或命名空间。

由空格分隔多个事件值,也可以是数组。必须是有效的事件。

childSelector 可选。规定只能添加到指定的子元素上的事件处理程序(且不是选择器本身,比如已废弃的 delegate() 方法)。
data 可选。规定传递到函数的额外数据。
function 可选。规定当事件发生时运行的函数。

之前有写过 on() 的相关内容:

页面:

<body>
<button>我是按钮1</button>
<button>我是按钮2</button>
</body>

调用方法

$("button").on("click", function () {alert("click1");
});$("button").on("click", function () {alert("click2");
});$("button").on("mouseenter", function () {alert("mouseenter");
});$("button").on("mouseleave", function () {alert("mouseleave");
});

当调用以上方法时,会进行相关事件的触发。由于on的特点:

1.注册多个相同类型事件, 后注册的不会覆盖先注册的
2.注册多个不同类型事件, 后注册的不会覆盖先注册的

最终的结果会是(根据触发先后顺序): mouseenter -> click1 -> click2 -> mouseleave

编写函数方法进行调用:

var btn = document.querySelector("button");btn.addEventListener("click", function (ev) {alert("click1");
});
//IE8及以下版本:btn.attachEvent("onclick", function () {alert("click1");});

封装函数

var btn = document.querySelector("button");function addEvent(dom, name, callBack) {if(dom.addEventListener){dom.addEventListener(name, callBack);}else{dom.attachEvent("on"+name, callBack);}
}
addEvent(btn, "click", function () {alert("click1");
})

同样,运行结果也是上面的。

$("button").on("click", function () {alert("click1");});$("button").on("click", function () {alert("click2");});

当自己想要进行jQuery源码编辑时。这个button事件的触发可能会有所不同。以上面的例子输出结果应该是click1 -> click2

但是当在低级浏览器时,结果却是:click2 - > click1

这时,可以进行方法的编写进行统一:

  1. 在btn事件创建一个数组:btn.eventsCache = {}
  2. 通过push()方法进行相关事件的传递
  3. 通过循环,进行事件方法的输出
  4. 统一高级和低级浏览器的方法

源码如下:

function addEvent(dom, name, callBack) {//相关事件调用如下// btn, "click", test1// btn, "click", test2// btn, "mouseenter", test3// btn, "mouseleave", test4if(!dom.eventsCache){dom.eventsCache = {}; //btn.eventsCache = {}   创建空的对象}if(!dom.eventsCache[name]){//如果没有指定的类型,就进行数组的添加/* //属性方法,数组内容的添加btn.eventsCache = {click: [test1, test2],mouseenter: [test3],mouseleave: [test4]}*/dom.eventsCache[name] = [];dom.eventsCache[name].push(callBack);if(dom.addEventListener){//根据顺序进行推入// 1. click  3.mouseenter 4.mouseleavedom.addEventListener(name, function () {for(var i = 0; i < dom.eventsCache[name].length; i++){dom.eventsCache[name][i]();}});}else{dom.attachEvent("on"+name, function () {//IE8及其以下浏览器for(var i = 0; i < dom.eventsCache[name].length; i++){dom.eventsCache[name][i]();}});}}else{//存在相同属性名称的数组之后,直接进行push方法dom.eventsCache[name].push(callBack);}
}
//编写函数
function test1(){alert("click1");
}
function test2(){alert("click2");
}
function test3(){alert("mouseenter");
}
function test4(){alert("mouseleave");
}
// btn.eventsCache = [test1, test2];
//进行调用
addEvent(btn, "click", test1);
addEvent(btn, "click", test2);
addEvent(btn, "mouseenter", test3);
addEvent(btn, "mouseleave", test4);

相关解释在注释内,最终的结果会是(根据触发先后顺序): mouseenter -> click1 -> click2 -> mouseleave

源码封装

on: function (name, callBack) {// 1.遍历取出所有元素this.each(function (key, ele) {// 2.判断当前元素中是否有保存所有事件的对象if(!ele.eventsCache){ele.eventsCache = {};}// 3.判断对象中有没有对应类型的数组if(!ele.eventsCache[name]){ele.eventsCache[name] = [];// 4.将回调函数添加到数据中ele.eventsCache[name].push(callBack);// 5.添加对应类型的事件njQuery.addEvent(ele, name, function () {njQuery.each(ele.eventsCache[name], function (k, method) {method.call(ele);});});}else{// 6.将回调函数添加到数据中ele.eventsCache[name].push(callBack);}});return this;
},

off(type, callback)

定义和用法

off() 方法通常用于移除通过 on()方法添加的事件处理程序。

自 jQuery 版本 1.7 起,off() 方法是 unbind()、die() 和 undelegate() 方法的新的替代品。该方法给 API 带来很多便利,我们推荐使用该方法,它简化了 jQuery 代码库。

注意:如需移除指定的事件处理程序,当事件处理程序被添加时,选择器字符串必须匹配 on() 方法传递的参数。

提示:如需添加只运行一次的事件然后移除,请使用 one()方法。


语法

$(selector).off(event,selector,function(eventObj),map)

参数 描述
event 必需。规定要从被选元素移除的一个或多个事件或命名空间。

由空格分隔多个事件值。必须是有效的事件。

selector 可选。规定添加事件处理程序时最初传递给 on() 方法的选择器。
function(eventObj) 可选。规定当事件发生时运行的函数。
map 规定事件映射 ({event:function, event:function, ...}),包含要添加到元素的一个或多个事件,以及当事件发生时运行的函数。
function test1() {alert("click1");
}
function test2() {alert("click2");
}
function test3() {alert("mouseenter");
}
$("button").on("click", test1);
$("button").on("click", test2);
$("button").on("mouseenter", test3);

进行off方法的调用:

1.不传参, 会移除所有事件

$("button").off();

2.传递一个参数, 会移除对应类型所有事件

$("button").off("click");

最终输出:  mouseenter

3.传递两个参数, 会移除对应类型对应事件

$("button").off("click", test1);

最终输出的结果 : mouseenter -> click2

源码封装

off: function (name, callBack) {// 1.判断是否没有传入参数if(arguments.length === 0){this.each(function (key, ele) {ele.eventsCache = {};});}// 2.判断是否传入了一个参数else if(arguments.length === 1){this.each(function (key, ele) {ele.eventsCache[name] = [];});}// 3.判断是否传入了两个参数else if(arguments.length === 2){this.each(function (key, ele) {njQuery.each(ele.eventsCache[name], function (index, method) {// 判断当前遍历到的方法和传入的方法是否相同if(method === callBack){ele.eventsCache[name].splice(index,  1);}});});}return this;
}

Mr.J-- jQuery学习笔记(三十一)--事件操作方法(onoff)相关推荐

  1. 【Libevent】Libevent学习笔记(三):事件循环

    00. 目录 文章目录 00. 目录 01. event_base_loop函数 02. event_base_dispatch函数 03. event_base_loopexit函数 04. eve ...

  2. 【传智播客】Libevent学习笔记(三):事件循环

    目录 00. 目录 01. event_base_loop函数 02. event_base_dispatch函数 03. event_base_loopexit函数 04. event_base_l ...

  3. Mr.J-- jQuery学习笔记(三十)--属性操作方法(添加删除)

    添加 addClass() 给元素添加一个或多个指定的类 <div class="aabb abc"></div> <div class=" ...

  4. 学习笔记三十一:IO流(三)

    活鱼会逆流而上,死鱼才会随波逐流. 本讲内容:文件流 例一:写一个记事本 package b;import java.io.*; import java.awt.*; import javax.swi ...

  5. JAVA学习笔记(三十一)-电影系统案例

    伪代码 系统的角色类准备 用户购票 用户评分 商家功能 首页设计 先封装 public class Business extends User{// 店铺名称private String shopNa ...

  6. Mr.J-- jQuery学习笔记(三十二)--jQuery属性操作源码封装

    扫码看专栏 jQuery的优点 jquery是JavaScript库,能够极大地简化JavaScript编程,能够更方便的处理DOM操作和进行Ajax交互 1.轻量级 JQuery非常轻巧 2.强大的 ...

  7. jQuery学习笔记之DOM操作、事件绑定(2)

    jQuery学习笔记之DOM操作.事件绑定(2) --------------------学习目录------------------------ 4.DOM操作 5.事件绑定 源码地址: https ...

  8. Mr.J-- jQuery学习笔记(二十一)--模拟微博页面

    先看之前的节点操作方法:Mr.J-- jQuery学习笔记(二十)--节点操作方法 Mr.J-- jQuery学习笔记(五)--属性及属性节点 Mr.J-- jQuery学习笔记(十一)--事件委托  ...

  9. jQuery学习笔记:Ajax(二)

    接上篇"jQuery学习笔记:Ajax(一)". 3.jQuery.get(url,[data],[callback],[type])通过远程 HTTP GET 请求载入信息. 这 ...

最新文章

  1. MySQL引擎特性GIS-R-TREE
  2. [tire+最短路]Bless You Autocorrect!
  3. 使用String.intern减少内存使用
  4. 信息基础---LDPCcodes随机矩阵构造java项目源代码
  5. Remoting技术使用配置文件示例
  6. zabbix snmp 协议监控 dell iRDAC
  7. RabbitMQ的Work模式
  8. 投入 20 亿,赋能 1 万家,阿里云正式启动云原生合作伙伴计划
  9. 다양한 저장매체의 속도를 측정
  10. 你当初是如何走上编程之路的?
  11. 亲密关系沟通-【信任感】-巩固信任感的沟通方法
  12. 无线通信基础(二):高斯噪声中的检测
  13. Global Mapper24.0汉化中文版下载安装教程
  14. IIS配置启动.net项目时报错:“/”应用程序中的服务器错误。
  15. uniapp折叠框二级循环
  16. §6.5 分离性公理与子空间,(有限)积空间和商空间
  17. 手游平台系统搭建sdk服务端接口文档
  18. MWORKS.Syslab 使用攻略 | 信号处理工具箱实践-基于时差定位法的声源定位
  19. Mysql的索引、视图、触发器、存储过程
  20. Vue项目中使用海康安全生产平台播放监控视频

热门文章

  1. MTCNN可攻破?华为提出一种可复制、可靠的攻击方法
  2. CVPR 2019 | 国防科大提出双目超分辨算法,效果优异代码已开源
  3. 怎么用Python获取全网最全的杰尼龟表情包
  4. 零基础Python学习路线图,Python学习不容错过
  5. oracle更改语句用 怎么站位,Oracle 数据库如何修改控制文件的位置
  6. mycat两个mysql实例的搭建_Mycat-多实例的搭建
  7. 深度强化学习-Actor-Critic算法原理和实现
  8. logistic regression一点理解
  9. 译文 | 与TensorFlow的第一次接触第二篇:线性回归
  10. 复练-软考网规-IDS和IPS概念、分类、评价标准