资讯专栏INFORMATION COLUMN

jQuery 事件(三) 事件的绑定和解绑、对象的使用、自定义事件

niuxiaowei111 / 499人阅读

摘要:事件的绑定和解绑的多事件绑定之前学的鼠标事件,表单事件与键盘事件都有个特点,就是直接给元素绑定一个处理函数,所有这类事件都是属于快捷处理。由于浏览器事件冒泡特性,可以在触发时把这个事件往上冒泡到上,因为上绑定事件响应,所以能触发这个动作。

事件的绑定和解绑 on()的多事件绑定

之前学的鼠标事件,表单事件与键盘事件都有个特点,就是直接给元素绑定一个处理函数,所有这类事件都是属于快捷处理。翻开源码其实可以看到,所有的快捷事件在底层的处理都是通过一个"on"方法来实现的。jQuery on()方法是官方推荐的绑定事件的一个方法

基本用法:.on( events ,[ selector ] ,[ data ] )

最常见的给元素绑定一个点击事件,对比一下快捷方式与on方式的不同

$("#elem").click(function(){})         // 快捷方式
$("#elem").on("click",function(){})    // on方式

on可以自定义事件名

多个事件绑定同一个函数

// 通过空格分离,传递不同的事件名,可以同时绑定多个事件
$("#elem").on("mouseover mouseout",function(){ });

多个事件绑定不同函数

// 通过空格分离,传递不同的事件名,可以同时绑定多个事件,每一个事件执行自己的回调方法
$("#elem").on({
    mouseover:function(){},  
    mouseout:function(){}
});

将数据传递到处理程序

function greet( event ) {
  alert( "Miami Heat -- " + event.data.name );        //Miami Heat -- D.Wade 
}
$( "button" ).on( "click", { name: "D.Wade" }, greet );

可以通过第二参数(对象),当一个事件被触发时,要传递给事件处理函数的

on()的高级用法

on()的事件委托机制

.on( events ,[ selector ] ,[ data ], handler(eventObject) )

在on的第二参数中提供了一个selector选择器,简单的来描述下

参考下面3层结构

目标节点 //点击在这个元素上

给出如下代码:

$("div").on("click","p",fn)

事件绑定在最上层div元素上,当用户触发在a元素上,事件将往上冒泡,一直会冒泡在div元素上。如果提供了第二参数,那么事件在往上冒泡的过程中遇到了选择器匹配的元素,将会触发事件回调函数

卸载事件off()方法

通过.on()绑定的事件处理程序

通过off() 方法移除该绑定

根据on绑定事件的一些特性,off方法也可以通过相应的传递组合的事件名,名字空间,选择器或处理函数来移除绑定在元素上指定的事件处理函数。当有多个过滤参数时,只有与这些参数完全匹配的事件处理函数才会被移除

绑定2个事件

$("elem").on("mousedown mouseup",fn)

删除一个事件

$("elem").off("mousedown")

删除所有事件

$("elem").off("mousedown mouseup")

快捷方式删除所有事件,这里不需要传递事件名了,节点上绑定的所有事件讲全部销毁

$("elem").off()
事件对象的使用 jQuery事件对象的作用

标准的"click"点击事件

$(elem).on("click",function(event){
   event //事件对象
})

在不同浏览器之间事件对象的获取, 以及事件对象的属性都有差异。jQuery根据 W3C 标准规范了事件对象,所以在jQuery事件回调方法中获取到的事件对象是经过兼容后处理过的一个标准的跨浏览器对象

  • .........

上述ul有N个子元素li,如果需要响应每一个li的事件,那么常规的方法就是需要给所有的li都多带带绑定一个事件监听,写法符合逻辑,但繁琐。因为li都有一个共同的父元素,而且所有的事件都是一致的,这里我们可以采用要一个技巧来处理,也是常说的"事件委托"

事件没直接和li元素发生关系,而且绑定父元素了。由于浏览器事件冒泡特性,可以在触发li时把这个事件往上冒泡到ul上,因为ul上绑定事件响应,所以能触发这个动作。

事件对象
怎么才知道触发的li元素是哪个一个?这个问题引出了事件对象

事件对象是用来记录一些事件发生时的相关信息的对象。事件对象只有事件发生时才会产生,并且只能是事件处理函数内部访问,在所有事件处理函数运行结束后,事件对象就被销毁

事件对象是跟当前触发元素息息相关的,能从里面获取相关的信息,找到 event.target

event.target

target 属性可以是注册事件时的元素,或者它的子元素。通常用于比较 event.target 和 this 来确定事件是不是由于冒泡而触发的。经常用于事件冒泡时处理事件委托

event.target代表当前触发事件的元素,可以通过当前元素对象的一系列属性来判断是不是我们想要的元素





    
    
    
    



    

事件委托,通过事件对象区别触发元素

  • 点击:触发一
  • 点击:触发二
  • 点击:触发三
  • 点击:触发四
jQuery事件对象的属性和方法

event.type:获取事件的类型

触发元素的事件类型

$("a").click(function(event) {
  alert(event.type);        // "click"事件
});

event.pageX 和 event.pageY:获取鼠标当前相对于页面的坐标

通过这2个属性,可以确定元素在当前页面的坐标值,鼠标相对于文档的左边缘的位置(左边)与 (顶边)的距离,简单来说是从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化

event.preventDefault() 方法:阻止默认行为

这个用的特别多,在执行这个方法后,如果点击一个链接(a标签),浏览器不会跳转到新的 URL 去了。我们可以用 event.isDefaultPrevented() 来确定这个方法是否(在那个事件对象上)被调用过了

event.stopPropagation() 方法:阻止事件冒泡

事件是可以冒泡的,为防止事件冒泡到DOM树上,也就是不触发的任何前辈元素上的事件处理函数

event.which:获取在鼠标单击时,单击的是鼠标的哪个键

event.which 将 event.keyCode 和 event.charCode 标准化了。event.which也将正常化的按钮按下(mousedown 和 mouseupevents),左键报告1,中间键报告2,右键报告3

event.currentTarget : 在事件冒泡过程中的当前DOM元素

冒泡前的当前触发事件的DOM对象, 等同于this.

this和event.target的区别:

js中事件是会冒泡的,所以this是可以变化的,但event.target不会变化,它永远是直接接受事件的目标DOM元素;

.this和event.target都是dom对象

如果要使用jquey中的方法可以将他们转换为jquery对象。比如this和$(this)的使用、event.target和$(event.target)的使用;

自定义事件 trigger事件

类似于mousedown、click、keydown等等这类型的事件都是浏览器提供的,通俗叫原生事件,这类型的事件是需要有交互行为才能被触发

在jQuery通过on方法绑定一个原生事件

$("#elem").on("click", function() {
    alert("触发系统事件")
 });

alert需要执行的条件:必须有用户点击才可以。如果不同用户交互是否能在某一时刻自动触发该事件呢?正常来说是不可以的,但是jQuery解决了这个问题,提供了一个trigger方法来触发浏览器事件

$("#elem").trigger("click");
//在绑定on的事件元素上,通过trigger方法就可以调用到alert

.trigger定义

根据绑定到匹配元素的给定的事件类型执行所有的处理程序和行为

trigger除了能够触发浏览器事件,同时还支持自定义事件,并且自定义时间还支持传递参数

$("#elem").on("Jeremy", function(event,arg1,arg2) {
    alert("自触自定义时间")
 });
$("#elem").trigger("Jeremy",["参数1","参数2"])

trigger触发浏览器事件与自定义事件的区别

自定义事件对象,是jQuery模拟原生实现的

自定义事件可以传递参数

triggerHandler事件

trigger事件还有一个特性:会在DOM树上冒泡,所以如果要阻止冒泡就需要在事件处理程序中返回false或调用事件对象中的.stopPropagation() 方法可以使事件停止冒泡

trigger事件是具有触发原生与自定义能力的,但是存在一个不可避免的问题: 事件对象event无法完美的实现,毕竟一个是浏览器给的,一个是自己模拟的。尽管 .trigger() 模拟事件对象,但是它并没有完美的复制自然发生的事件,若要触发通过 jQuery 绑定的事件处理函数,而不触发原生的事件,使用.triggerHandler() 来代替

triggerHandler与trigger的用法是一样的,重点看不同之处:

triggerHandler不会触发浏览器的默认行为,.triggerHandler( "submit" )将不会调用表单上的.submit()

.trigger() 会影响所有与 jQuery 对象相匹配的元素,而 .triggerHandler() 仅影响第一个匹配到的元素

使用 .triggerHandler() 触发的事件,并不会在 DOM 树中向上冒泡。如果它们不是由目标元素直接触发的,那么它就不会进行任何处理

与普通的方法返回 jQuery 对象(这样就能够使用链式用法)相反,.triggerHandler() 返回最后一个处理的事件的返回值。如果没有触发任何事件,会返回 undefined





    
    
    
    



自定义事件triggerHandler



文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91393.html

相关文章

  • jQuery 事件命名空间

    摘要:但是如果你不知道这个函数的名字,或者你用的是匿名函数怎样才能精确地解绑某一个事件监听器呢该了解一下的事件命名空间了先上代码这里不只是把事件作为参数传入方法,而是给事件指定了一个命名空间,然后监听了这个命名空间里的事件。 用 jQuery 绑定和解绑事件监听器都是非常简单的。但是当你为一个元素的一个事件绑定了多个监听器时,怎样精确地解绑其中一个监听器?我们需要了解一下事件的命名空间。 ...

    suemi 评论0 收藏0
  • jQuery入门笔记之(事件详解

    摘要:可以传递三个参数表示一个或多个事件类型,比如。表示绑定到指定元素的处理函数。我们称它为简写事件。必须在中,并且使用作为事件触发元素,不然无效。和表示鼠标移入和移出的时候触发。按下返回按下返回和分别表示光标激活和丢失,事件触发时机是当前元素。 转自个人博客 在JavaScript 有一个非常重要的功能,就是事件驱动。如果你的网页需要与用户进行交互的话,就不可能不用到事件。它在页面完全加...

    GitCafe 评论0 收藏0
  • JavaScript忍者秘籍

    摘要:用函数构造器进行求值中的所有函数都是的实例,可以直接使用构造器来实例化函数。构造器可变参数列表的最后一个参数,始终是要创建函数的函数体内容。 1. JavaScript常用测试框架: QUnit YUI Test JsUnit Jasmine 2. 断言: 单元测试框架的核心是断言方法,通常叫做assert()。该方法通常接受一个值——需要断言的值,以及一个表示该断言目的的描述...

    Acceml 评论0 收藏0
  • JQuery基础修炼-事件

    摘要:目录第章事件介绍第章鼠标事件第章表单事件第章键盘事件第章事件的绑定和解绑第章事件对象的使用第章自定义事件与事件用交互操作中,最简单直接就是点击操作。提供了两个方法一个是方法用于监听用户单击操作,另一个方法是方法用于监听用户双击操作。 目录 第1章 事件介绍 第2章 鼠标事件 第3章 表单事件 第4章 键盘事件 第5章 事件的绑定和解绑 第6章 事件对象的使用 第7章 自定义事件 cli...

    yy13818512006 评论0 收藏0
  • JQuery基础修炼-事件

    摘要:目录第章事件介绍第章鼠标事件第章表单事件第章键盘事件第章事件的绑定和解绑第章事件对象的使用第章自定义事件与事件用交互操作中,最简单直接就是点击操作。提供了两个方法一个是方法用于监听用户单击操作,另一个方法是方法用于监听用户双击操作。 目录 第1章 事件介绍 第2章 鼠标事件 第3章 表单事件 第4章 键盘事件 第5章 事件的绑定和解绑 第6章 事件对象的使用 第7章 自定义事件 cli...

    hikui 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<