热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mr.J的jQuery学习笔记:第三十一讲——深入解析事件操作(on/off)方法

`on()`方法用于在选定元素及其子元素上绑定一个或多个事件处理程序。从jQuery1.7版本开始,`on()`方法取代了`bind()`、`delegate()`和`live()`方法,成为统一的事件绑定方式。该方法不仅支持直接绑定事件,还支持事件委托,使得事件处理更加灵活和高效。通过`off()`方法,可以移除之前使用`on()`绑定的事件处理程序,从而实现对事件的动态管理。

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() 的相关内容:

页面:




调用方法

$("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 }
//编写函数
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;
}

 


推荐阅读
  • JavaScript XML操作实用工具类:XmlUtilsJS技巧与应用 ... [详细]
  • 《精通 jQuery》第六章:深入解析与实战应用
    《精通 jQuery》第六章:深入解析与实战应用本章详细探讨了 Ajax 技术的核心机制及其实际应用。Ajax 通过 XMLHttpRequest 对象实现客户端与服务器之间的异步数据交换,从而在不重新加载整个页面的情况下更新部分内容。这种技术不仅提升了用户体验,还提高了应用的响应速度和效率。此外,本章还介绍了如何利用 jQuery 简化 Ajax 操作,并提供了多个实战案例,帮助读者更好地理解和掌握这一重要技术。 ... [详细]
  • ZTree工具类全面汇总:实现节点的增删改及后台提交功能
    本文全面总结了ZTree工具类的使用方法,详细介绍了如何实现节点的增加、删除、修改以及后台数据提交等功能。通过实例代码和具体操作步骤,帮助开发者高效地掌握ZTree的各类操作,提升开发效率。此外,还提供了常见问题的解决方案,如在SpringBoot集成X-admin2.2时遇到的Layui字体图标显示问题。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 利用 PHP APICommonUrl 中转实现 jQuery JSONP 请求优化 ... [详细]
  • 深入探讨 JavaScript 中 async/await 的常见问题及解决方案 ... [详细]
  • Vue 实战基础教程第9讲:深入理解计算属性与侦听器的高效使用
    Vue 实战基础教程第9讲:深入理解计算属性与侦听器的高效使用 ... [详细]
  • 本文详细介绍了 jQuery 的入门知识与实战应用,首先讲解了如何引入 jQuery 库及入口函数的使用方法,为初学者提供了清晰的操作指南。此外,还深入探讨了 jQuery 在实际项目中的多种应用场景,包括 DOM 操作、事件处理和 AJAX 请求等,帮助读者全面掌握 jQuery 的核心功能与技巧。 ... [详细]
  • 在使用 `useSelector` 选择器时,发现分派操作后状态未能实时更新。这可能是由于 React 组件的渲染机制或 Redux 的状态管理问题导致的。建议检查 `useSelector` 的依赖项和 `dispatch` 的调用时机,确保状态变化能够正确触发组件重新渲染。此外,可以考虑使用 `useEffect` 钩子来监听状态变化,以确保及时更新。 ... [详细]
  • 深入解析 Vue 中的 Axios 请求库
    本文深入探讨了 Vue 中的 Axios 请求库,详细解析了其核心功能与使用方法。Axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js 环境。文章首先介绍了 Axios 的基本概念,随后通过具体示例展示了如何在 Vue 项目中集成和使用 Axios 进行数据请求。无论你是初学者还是有经验的开发者,本文都能为你解决 Vue.js 相关问题提供有价值的参考。 ... [详细]
  • 优化升级版数据采集与赋值方法,专为前文内容设计
    在前一篇文章中,方法的局限性主要体现在需要传递参数,并且参数数量受限。当页面布局与所需参数不匹配时,该方法将无法正常工作。为此,我们推出了优化升级版1.1,旨在解决这些问题并提高灵活性和适用性。 ... [详细]
  • C#中实现高效UDP数据传输技术
    C#中实现高效UDP数据传输技术 ... [详细]
  • 本文详细解析了如何使用 jQuery 实现一个在浏览器地址栏运行的射击游戏。通过源代码分析,展示了关键的 JavaScript 技术和实现方法,并提供了在线演示链接供读者参考。此外,还介绍了如何在 Visual Studio Code 中进行开发和调试,为开发者提供了实用的技巧和建议。 ... [详细]
  • SQLite数据库CRUD操作实例分析与应用
    本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。 ... [详细]
  • 如何使用FindWindow360问答功能?探索其专业应用与技巧 ... [详细]
author-avatar
思念如此难受_351
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有