实例方法:

  • on()
  • one()
  • off()
  • trigger()
  • hover()

一、绑定事件与jQuery事件委托

  • $(selector).eventType(fn);
  • $(selector).on(event,childSelector,data,function);
  • $(selector).one(event,data,function);

1.jQuery可以直接通过点击内置事件类型方法来添加事件程序,比如添加点击事件:$("...").click(function(){console.log(“点我”);});

2.on()方法绑定事件处理程序:

 参数  说明
 event

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

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

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

3.这里展示一下不常见的添加多个事件程序:

//html
<p>Move.</p> //css
.intro{
font-size:150%;
color:red;
} //js--toggleClass()方法对添加和移除被选元素的一个或多个类进行切换。
$("p").on("mouseover mouseout",function(){
$("p").toggleClass("intro");
});

4.当然也可以给同一个事件绑定多次,与addEventListener()的元素js方法一致。

5.当不指定给子元素绑定事件时,有需要给事件函数传入更多数据的话可以采用对象的方式传入,这样第二个参数就不会被识别为选择器了。(更简单的方式就是直接给第二个参数写一个逗号,不传入参数)

6.jQuery事件委托:

//html
<ul>
<li>0</li>
...省略n个li
<li>n+1</li>
</ul> //js
$("ul").on("click",function(e){
alert( $(e.target).text() );
});

但是在事件委托有时候会存在一些问题,以上面示例来说,比如不希望点击事件在ul上触发,那么这时候第二个参数就发挥作用了:

$("ul").on("click","li",function(e){
alert( $(e.target).text() );
});

通过以上的修改后,依旧保持事件委托状态,但是点击ul时,事件不会执行,而点击li依然可以正常执行。

7.关于一次事件(one())绑定的应用:

  • 有需求是第一次点击a标签跳转淘宝,以后点击都跳转百度
//html
<a href="https://www.baidu.com" target="_blank">jump</a> //js
$("a").one("click",function(e){
window.open("https://www.taobao.com");
//阻止第一次点击跳转到百度(下面两个操作都可以实现)
//return false;
e.preventDefault(); });

8.同时给一个dom添加多个事件程序

//html
<div class="demo" style="width: 100px;height: 100px;background-color: red;"></div> //js
$(".demo").on({
click:function(){
console.log('click');
},
mouseenter:function(){
console.log('mouseenter');
},
mouseleave:function(){
console.log('mouseleave');
}
});

二、解除事件程序

  • jQuery.off()
  • jQuery.off(eventType)
  • jQuery.off(eventType,fun)
  • jQuery.off(eventType,daughter,fun)
//html
<div class="demo" style="width: 100px;height: 100px;background-color: red;"></div> //js
function eventOne(){ console.log("eventOne"); }
function eventTwo(){ console.log("eventTwo"); } $(".demo").on('click',eventOne);
$(".demo").on('click',eventTwo);
$(".demo").on('mouseenter',eventOne); $(".demo").off();//解除demo所有事件的事件程序,包括默认事件
$(".demo").off("click");//解除demo的点击事件的所有事件程序
$(".demo").off("click",eventOne);//解除demo的点击事件的eventOne事件程序

在事件委托的事件处理程序绑定时,有指定事件程序只在后辈元素上才有效执行,在绑定事件的元素上不会被触发的一种绑定方式,看示例:

//html
<ul>
<li>0</li>
...省略n个li
<li>n+1</li>
</ul> //js
$("ul").on("click","li",function(e){
alert( $(e.target).text() );
});

这种绑定方式实质上就是将事件绑定在ul上,所以解绑事件程序还是解绑ul的事件程序:

$("ul").off("click");
$("ul").off("click","li");//这种方式也没问题
$("ul").off("click","li",fun);//为了程序的可读性,怎么绑定就怎么解除是最规范的写法

当然上面的事件程序是函数表达式不能指定实现指定函数解绑了。

三、主动触发事件程序方法(trigger)及实现原理

  • $(selector).trigger(event,param1,param2,...)
  • 使用说明:
 参数  说明
 event  必需。规定指定元素上要触发的事件。可以是自定义事件,或者任何标准事件。
 param1,param2,...

可选。传递到事件处理程序的额外参数。额外的参数对自定义事件特别有用。

也可以写成数组方式传入[param1,param2,...]

一个简单的trigger示例代码:

//html
<div class="demo" style="width:100px; height:100px; background-color:red;"></div> //js
$(".demo").on("click", function(a,b,c,d){
console.log(a,b,c,d);
});
$(".demo").trigger("click",[10,20,30,40]);

常见的trigger()使用场景“首次加载倒数广告图层”,当倒数到零时自动取消广告图层,也可以在没有到达零秒之前人为点击取消广告。

(时间紧迫,本想封装一个完整的功能的,有时间再来实现了!)

  • jQuery.on()的自定义事件

  • trigger与自定义事件实现原理

把on的自定义事件放到这部分来分析,绝对不是前面忘记了,想必聪明的你已经想到了,自定义方法没有触发机制,所以必须要trigger()方法来帮助自定义事件触发事件程序。先来看一个简单的自定义事件示例:

//定义自定义事件pageLoad
$(".demo").on("pageLoad",function(){
console.log("我的第一个jQuery自定义事件");
});
//trigger触发pageLoad事件
$(".demo").trigger("pageLoad");

应用之简单是吧,好友没有撸源码了,来一波。

咳咳,我得纠正一下态度,绝不是因为它简单我就欺负它,而是大有用途,后期会基于jQuery模仿封装一个自己的fullPage插件,会大量的使用到自定义事件,所以觉得在这里有必要对jQuery自定义事件的原理及trigger的原理有深入的理解。(偷偷告诉你,自定义机制和触发事件机制在初级和中级前端面试中被提问的几率很高哦,中级和高级前端面试中常被提问的Event模块其内部思想非常类似)

//自写jQuery源码部分

//--on()--仅封装自定义事件(内部事件后期再补充)
//参数:type -- 事件类型; handle -- 事件触发程序
jQuery.prototype.myOn = function(type,handle){
//遍历jQuery对象的所有DOM
for(var i = 0; i < this.length; i++){
//给每个DOM上添加cacheEvent,用来保存每个DOM添加的事件类型
if( !this[i].cacheEvent ){
this[i].cacheEvent = {};
}
//每个DOM的每个事件类型(cacheEvent[type])上可以存储多个事件处理函数
if( !this[i].cacheEvent[type] ){
//第一次添加该事件类型时,直接将事件处理函数作为数组元素添加到该事件类型下
this[i].cacheEvent[type] = [handle];
}else{
//如果有该事件类型,并且有值,就将事件函数添加到数组后面
this[i].cacheEvent[type].push(handle);
}
}
} //--trigger事件触发
//参数:type -- 事件类型
jQuery.prototype.myTrigger = function(type){
var self = this;
//获取事件程序需要的参数 -- 兼容序列化和数组两种方式传入
var params = arguments.length > 1 ? (Object.prototype.toString.call(arguments[1]) == "[object Array]" ? arguments[1] : [].slice.call(arguments,1) ) : [];
//遍历jQuery对象的所有DOM
for(var i = 0; i < this.length; i++){
//判断是否含有指定的事件类型
if( this[i].cacheEvent[type] ){
//遍历并执行DOM上指定事件类型的所有函数 -- ele函数
//由于forEach内执行事件程序是this指向window,所以需要self
this[i].cacheEvent[type].forEach(function(ele,index){
ele.apply(self,params);
});
}
}
} //测试代码
<div class="demo" style="width: 100px; height: 100px; background-color: red;"></div> <script type="text/javascript" src="MyjQuery.js"></script>
<script type="text/javascript">
$(".demo").myOn("pageLoad",function(a,b,c){
console.log("trigger成功"+ a + b + c );
});
$(".demo").myTrigger("pageLoad",10,20,30);
$(".demo").myTrigger("pageLoad",["中","国","人"]);
</script>

全部jQuery源码等总结完jQuery使用系列博客后会在相关博客上传。

四、hover()

其实hover这个方法非常的简单,而且经常使用,这个方法同等于mouseenter和mouseleave,这种操作非常贴合交互行为,鼠标移入必然就会有移出,如果在这两个状态下需要对行为作出反应,这个方法就再合适不过了,下面就写一个同等对比示例代码:

$(".demo").on("mouseenter",function(){
consoel.log("enter");
}).on("mouseleave",function(){
consoel.log("leave");
});
//haver同等代码
$(".demo").hover(function(){
console.log("enter");
},function(){
console.log("leave");
});

但是hover并不是最友好的交互选择,因为连续的鼠标移入移出会出现抖动,因为事件被触发后会被放到执行队列,会把所有移入移出行为触发的事件都执行,所以对交互体验有一定要求的功能慎用。

jQuery使用(七):事件绑定与取消,及自定事件的实现原理的更多相关文章

  1. javascript 的事件绑定和取消事件

    研究fabricjs中发现,它提供canvas.on('mousemove', hh) 来绑定事件, 提供 canvas.off()来取消绑定事件这样的接口,很是方便, 那我们就不妨探究一下内在的实现 ...

  2. 事件绑定、取消的二种形式 & call

    <script> //call 函数下的一个方法,call方法第一个参数可以改变函数执行过程中的内部this的指向,call方法第二个参数开始就是原来函数的参数列表. function f ...

  3. 学习javaScript必知必会(4)~事件、事件绑定、取消事件冒泡、事件对象

    1.常用的事件: ① onload:页面加载 ② onblur: 失去焦点 onfocus: 获取焦点 ③ onclick:点击 ④ onmouseover:鼠标经过 onmouseout:鼠标离开 ...

  4. 事件绑定的快捷方式 利on进行事件绑定的几种情况

    [事件绑定快捷方式]$("button:first").click(function(){ alert(1); }); [使用on绑定事件] ① 使用on进行单事件绑定 $(&qu ...

  5. jQuery 中的事件绑定与取消绑定

    1:在jQuery中使用bind方法进行事件的绑定,bind方法有两个参数,第一个参数是事件的类型例如click,change,keyup,keydown,blur,focus等.第二个参数是一个回调 ...

  6. jQuery事件绑定的最佳实践

    如果你经常使用jQuery,那么你也许很熟悉事件绑定.这是很基本的东西,但是深入一点,你就能够找到机会让你事件驱动的代码变得不太零碎,并且更容易管理. 更好的选择器策略 让我们从基础的例子开始.下面的 ...

  7. jQuery的事件绑定命名空间

    jQuery的bind的函数在实际应用中用的不是特别多,只是他可以绑定一个事件,但不会即时触发,也可以通过unbind来解除绑定.在没有看到这篇文章之前,我一直不知道原来bind也可以有命名空间.事实 ...

  8. jQuery中的事件绑定的几种方式

    jQuery目前有on(),bind(),delegate(),live()四种绑定方式,但是随着版本的不断更新,有的方式也相应的被淘汰掉 [band()方式绑定] 3.0版本之前的绑定方式比较常用的 ...

  9. JQuery实现click事件绑定与触发方法分析

    原生JS通过什么方法绑定click事件? 原生js有一下三种方法为DOM对象绑定click事件, 第一种,在html中添加 onclick属性,在此属性中添加要绑定的事件函数,如下, 这种方法为htm ...

随机推荐

  1. [HDU2065] "红色病毒"问题

    传送门:>Here< 题意:现在有一长度为N的字符串,满足一下条件: (1) 字符串仅由A,B,C,D四个字母组成; (2) A出现偶数次(也可以不出现); (3) C出现偶数次(也可以不 ...

  2. Codeforces519 E. A and B and Lecture Rooms

    传送门:>Here< 题意:询问给出一棵无根树上任意两点$a,b$,求关于所有点$i$,$dist(a,i) = dist(b,i)$的点的数量.要求每一次询问在$O(log n)$的时间 ...

  3. Hdoj 1875.畅通工程再续 题解

    Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖 ...

  4. 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)

    [UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...

  5. 【bfs】1252 走迷宫

    [题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ...

  6. [ZJOI2006]超级麻将(可行性dp)

    题目描述 要判断某人是否胡牌,显然一个弱智的算法就行了,某中学信息学小组超级麻将迷想了想,决定将普通麻将改造成超级麻将. 所谓超级麻将没有了砣.索.万的区分,每种牌上的数字可以是1~100,而每种数字 ...

  7. 【mysql】 mysql忘记密码

    先关闭mysql服务 [root@localhost ~]# service mysql status Redirecting to /bin/systemctl status mysql.servi ...

  8. 【php】php实现数组分块

    有时候需要将一个大数组按一定大小分块,那么可以实现这个功能,代码如下: /** * @param array $arr * @param int $size <p> * @param bo ...

  9. 牛客练习赛40 A 小D的剧场 (思维dp)

    链接:https://ac.nowcoder.com/acm/contest/369/A 题目描述 若你摘得小的星星 你将得到小的幸福  若你摘得大的星星 你将得到大的财富  若两者都能摘得 你将得到 ...

  10. 编写高质量代码:改善Java程序的151个建议 --[98~105]

    建议的采用顺序是List中泛型顺序依次为T.?.Object (1).List是确定的某一个类型 List表示的是List集合中的元素都为T类型,具体类型在运行期决定:List<?>表示的 ...