第5章 jQuery之事件

本文详细介绍jQuery中的事件绑定与解绑方法,包括动态绑定与事件委托的实现方式,以及如何使用.on()和.off()方法简化事件处理流程。同时,探讨了事件对象的属性与方法、冒泡与默认行为的控制策略。

我们可以使用jQuery为页面上的元素动态的绑定一个事件,也可以动态的解绑一个事件

5.1 动态绑定与动态解绑

1

bind  (绑定,不具有事件委托)

//使用.bind()不具备动态绑定功能,只有点击原始按钮才能生成

$('.button').bind('click',function(){

alert(“事件不委托”);

});

注意:bind只能绑定已经存在的元素,对于新生成的元素无法动态绑定(即不具有事件委托)

 

unbind  ( 解绑 )

  //使用unbind删除绑定的事件

$('input').unbind(); //删除所有当前元素的事件

//使用unbind参数删除指定类型事件

$('input').unbind('click'); //删除当前元素的click事件


    注意:事件委托在下方会讲到

2(事件委托)

  live  (绑定,具有事件委托,但是不支持连缀)

  //使用.live()具备动态绑定功能,jQuery1.3使用,jQuery1.7之后废弃,jQuery1.9删除

$('.button').live('click',function(){

alert(“事件委托”);

});

 

注意:

1、使用live绑定的是祖先元素docunent,而非button,所以永远只会绑定一次事件。

2、点击button其实是冒泡到document上的

3、点击document的时候,需要验证事件类型(event.type)和事件目标(event.target)如果 事件类型是click;事件目标是button,则触发

4.live()方法已经被删除,无法使用了。需要测试使用的话,需要引入向下兼容插件。

5不支持连缀,如:

 

die  ( 解绑 )

$('.button').die('click');

3(事件委托)

delegate (绑定,具有事件委托,支持连缀)

参数:

第一个参数是当前元素

第二个参数是事件方式

第三个参数是执行函数

 

如:

$('div').first().delegate('.button','click', function(){

$(this).clone().appendTo('div:first');

});

说明:

 

注意:

1.delegate()需要指定父元素

2delegate事件其实绑定在父类元素上

 

undelegate  ( 解绑 )

如:$('#box').undelegate('.button','click');


补充

目前绑定事件和解绑的方法有三组共六个。由于这三组的共存可能会造成一定的混乱,为此jQuery1.7以后推出了.on().off()方法彻底摒弃前面三组。

on替换绑定
替代.bind()方式

$('.button').on('click',function(){

alert('替代.bind()');

});


使用额外数据和事件对象

$('.button').on('click',{user:'Lee'}, function(e){

alert('替代.bind()'+e.data.user);

});


绑定多个事件

$('.button').on('mouseovermouseout',function(){

alert('替代.bind()移入移出!');

});


以对象模式绑定多个事件

$('.button').on({

mouseover:function(){

alert('替代.bind()移入!');

},

mouseout:function(){

alert('替代.bind()移出!');

}

});


阻止默认行为并取消冒泡

$('form').on('submit',function(){

return false;

});

$('form').on('submit',false);

 

//替代.bind()方式,阻止默认行为

$('form').on('submit',function(e){

e.preventDefault();

});


//替代.bind()方式,取消冒泡

$('form').on('submit',function(e){

e.stopPropagation();

});

替代.live().delegate()

$('#box').on('click','.button', function(){

$(this).clone().appendTo('#box');

});

off替换解绑
替代.unbind()方式

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

$('.button').off('click',fn);

$('.button').off('click.abc');

替代.die().undelegate()

$('#box').off('click','.button');

one

不管是.bind()还是.on(),绑定事件后都不是自动移除事件的,需要通过.unbind().off()来手工移除。jQuery提供了.one()方法,绑定元素执行完毕后自动移除事件,可以方法仅触发一次的事件。

 

//类似于.bind()只触发一次

$('.button').one('click',function(){

alert('one仅触发一次!');

});

 

//类似于.delegate()只触发一次

$('#box).one('click','.button',function(){

alert('one仅触发一次!');

});

复合事件

jQuery提供了许多最常用的事件效果,组合一些功能实现了一些复合事件,比如切换功能、智能加载等

hover

$('div').hover(function(){

$(this).css('background','black'); //mouseenter效果

},function(){

$(this).css('background','red'); //mouseleave效果,可省略

});

toggle(1.8版废用)

$('div').toggle(function(){  //第一次点击切换

$(this).css('background','black');

},function(){  //第二次点击切换

$(this).css('background','blue');

},function(){  //第三次点击切换

$(this).css('background','red');

});

 

注意:已经被1.8版废用,可以下载jquery-migrate.js文件,来向下兼容已被删除掉的方法

 

事件对象(event)

事件对象就是event对象,通过处理函数默认传递接受。

 

//通过处理函数传递事件对象

$('input').bind('click',function(e){  //接受事件对象参数

alert(e);

});

属性

data:获取事件调用时的额外数据

//通过event.data获取额外数据,可以是数字、字符串、数组、对象

$('input').bind('click',123,function(){  //传递data数据

alert(e.data); //获取数字数据

});

方法

1stopPropagation:设置到需要触发的事件上时,所有上层的冒泡行为都将被取消

2isPropagationStopped:判断是否取消了冒泡行为。

3preventDefault:禁用默认行为

4isDefaultPrevented:判断是否禁用了默认行为。

5stopImmediatePropagation:取消事件冒泡,并取消该事件的后续事件处理函数

6isImmediatePropagationStopped:判断是否调用了stopImmediatePropagation()方法

冒泡和默认行为

冒泡

如果在页面中重叠了多个元素,并且重叠的这些元素都绑定了同一个事件,那么就会出现冒泡问题。

例:

<div style="width:200px;height:200px;background:red;">

<input type="button" value="按钮"/>

</div>

 

$('input').click(function(){

alert('按钮被触发了!');

});

 

$('div').click(function(){

alert('div层被触发了!');

});

 

$(document).click(function(){

alert('文档页面被触发了!');

});

 

效果:

当我们点击文档的时:

只触发文档事件;

 

当我们点击div层时:

触发了div和文档两个;

 

当我们点击按钮时:

触发了按钮、div和文档。

 

总结:

1、冒泡的前提:

A、元素重叠

B、重叠的元素绑定了同一个事件

2、触发的顺序是从小范围到大范围。这就是所谓的冒泡现象,一层一层往上。

 

阻止冒泡:event.stopPropagation()

这个方法设置到需要触发的事件上时,所有上层的冒泡行为都将被取消。

如:

$('input').click(function(e){

alert('按钮被触发了!');

e.stopPropagation(); // 取消上层的所有冒泡行为

});

默认

网页中的元素,在操作的时候会有自己的默认行为。

比如:右击文本框输入区域,会弹出系统菜单、点击超链接会跳转到指定页面点击提交按

钮会提交数据

 

禁用默认行为:event.preventDefault()

 

注意:

如果想让上面的超链接同时阻止默认行为且禁止冒泡行为,可以把两个方法同时写上:

event.stopPropagation()event.preventDefault()。这两个方法如果需要同时启用的时候,还有一种简写方案代替,就是直接return false

如:

$('a').click(function(e){

return false;

});

模拟操作

在事件触发的时候,有时我们需要一些模拟用户行为的操作。

例如:当网页加载完毕后自行点击一个按钮触发一个事件,而不是用户去点击

  jQuery为我们提供了两个:

1. trigger()

  2.triggerHandler()

 

1

//点击按钮事件

$('input').click(function(){

alert('我的第一次点击来自模拟!');

});

 

//模拟用户点击行为

$('input').trigger('click');

 

2

// 这里效果与例1是一样的

$('input').click(function(){

alert('我的第一次点击来自模拟!');

}).trigger('click');

 

问题1:当模拟时,需要传递参数怎么办?

答:$('input').click(function(e,data1,data2){

alert(data1+',' +data2);

}).trigger('click',['abc', '123']);

注意:

1、事件执行传递参数,这个参数类似与event.data的额外数据,可以可以是数字、字符串、数组、对象。

2、当传递一个值的时候,直接传递即可。当两个值以上,需要在前后用中括号包含起来。但不能认为是数组形式triggerHandler使用上和上面差不多

如:

$('input').click(function(){

alert('我的第一次点击来自模拟!');

}).triggerHandler ('click');

trigger 与triggerHandler区别

1triggerHandler()方法并不会触发事件的默认行为,而trigger()

如果我们希望使用.trigger()来模拟用户提交,并且阻止事件的默认行为,则需要这么写:

$('form').submit(function(e){

e.preventDefault(); //阻止默认行为

}).trigger('submit');

2triggerHandler()方法只会影响第一个匹配到的元素,而trigger()会影响所有

3triggerHandler()方法会返回当前事件执行的返回值,如果没有返回值,则返回undefined.trigger()则返回当前包含事件触发元素的jQuery对象(方便链式连缀调用)

4trigger()在创建事件的时候,会冒泡。但这种冒泡是自定义事件才能体现出来,是jQuery扩展于DOM的机制,并非DOM特性。而.triggerHandler()不会冒泡

 

总结:

1、默认行为与冒泡问题

2、返回值问题

3、失明问题

命名空间(后面组件编程时会详细讲到)

有时,我们想对事件进行移除。但对于同名同元素绑定的事件移除往往比较麻烦,这个时候,可以使用事件的命名空间解决。

 

例:

$('input').bind('click.abc',function(){

alert('abc');

});

 

$('input').bind('click.xyz',function(){

alert('xyz');

});

 

$('input').unbind('click.abc'); //移除click实践中命名空间为abc

 

注意:

也可以直接使用('.abc'),这样的话,可以移除相同命名空间的不同事件。对于模拟操作.trigger().triggerHandler(),用法也是一样的。

如:

$('input').trigger('click.abc');

事件委托

什么是事件委托?

1

100个学生同时在某天中午收到快递,但这100个学生不可能同时站在学校门口等,那么都会委托门卫去收取,然后再逐个交给学生。

  2

如果一个企业级应用做报表处理,表格有2000行,每一行都有一个按钮处理。如果用之前的.bind()处理,那么就需要绑定2000个事件,就好比2000个学生同时站在 学校门口等快递,不断会堵塞路口,还会发生各种意外。这种情况放到页面上也是一样,可能导致页面极度变慢或直接异常。而且,2000个按钮使用ajax分页的 话,.bind()方法无法动态绑定尚未存在的元素。就好比,新转学的学生,快递员无法验证他的身份,就可能收不到快递。

 

而在jQuery中,我们通过事件冒泡的特性,让子元素绑定的事件冒泡到父元素(或祖先元素)上,然后再进行相关处理即可。

堵塞问题解决:将处理的事件交给父元素(或祖先元素)

意外问题解决:动态绑定事件

注意:bind只能绑定已经存在的元素,对于新生成的元素无法动态绑定

自定义事件

事件必须满足三个条件:

1、事件必须有名称

2、事件必须绑定在某一个对象上

3、事件必须有触发条件

 

如:div添加一个事件,该事件的名称为"itheima12很牛",当点击div的时候,触发click事件的同时触发"itheima12很牛"事件

$(function(){

     $("div").unbind("click");

     $("div").bind("click",function(){

         /**

            * 在点击div的时候,触发itheima12很牛事件

            */

         //$(this).trigger("第1个自定义事件",5);

       //$(this).trigger("第1个自定义事件",[5,6]); // 这里传的不是数组,而是两个参数

        $(this).trigger("第1个自定义事件",{

             aa:'aa',

             bb:'bb'

         });

     });

    

     $("div").unbind("第1个自定义事件");

     $("div").bind("第1个自定义事件",function(event,json){

         alert(json.aa);

         alert(json.bb);

     });

});

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值