位置: 编程技术 - 正文

详解javascript中的事件处理(javascript的)

编辑:rootadmin

推荐整理分享详解javascript中的事件处理(javascript的),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascriptz,javascript含义,javascript entries,javascript详细介绍,javascript definitive guide,javascript的,javascript的用法,javascript的,内容如对您有帮助,希望把文章链接给更多的朋友!

一.事件传播机制

  客户端JavaScript程序(就是浏览器啦)采用了异步事件驱动编程模型。当文档、浏览器、元素或与之相关的对象发生某些有趣的事情时,Web浏览器就会产生事件(event)。如果JavaScript应用程序关注特定类型的事件,那么它可以注册当这类事件发生时要调用的一个或多个函数。当然了,这种风格并非Web编程独有,所有使用图形用户界面的应用程序都采用了它。

既然要详解事件处理,那我们先从几个基础概念说起吧:

    ①事件类型(event type):是一个用来说明发生什么类型事件的字符串。例如,“mousemove”表示用户移动鼠标,“keydown”表示键盘上某个键被按下。事件类型只是一个字符串,有时候又称之为事件名字(event name);

    ②事件目标(event target):是发生事件或与之相关的对象。Window、Document和Element对象是最常见的事件目标。当然,AJAX中的XMLHttpRequest对象也是一个事件目标;

    ③事件处理程序(event handler):是处理或响应事件的函数,它也叫事件监听程序(event listener)。应用程序通过指明事件类型和事件目标,在Web浏览器中注册它们的事件处理函数。

    ④事件对象(event object):是与特定事件相关且包含有关该事件详细信息的对象。事件对象作为参数传递给事件处理函数(但是在IE8以及其之前版本中,全局变量event才是事件对象)。事件对象都有用来指定事件类型(event type)的type属性和指定事件目标(event target)的target属性(但是在IE8以及其之前版本中,用的是srcElement而非target)。当然,不同类型的事件还会为其相关事件对象定义一些其他的独有属性。例如,鼠标事件的相关对象会包含鼠标指针的坐标,而键盘事件的相关对象会包含按下的键和辅助键的详细信息。

  以上说完了四个基本概念。那么问题来了——如果在一个web页面上用鼠标点击一个元素a的某一子元素b时,应该先执行子元素b注册的事件处理程序还是先执行元素a注册的事件处理程序呢(假设元素a和它的子元素b都有注册事件处理程序)?身为读者的你是否想过这个问题呢?

  这个问题就涉及到浏览器中的事件传播(event propagation)机制。相信大家都听说过事件冒泡(event bubble)和事件捕获(event capturing)吧!没错,它们就是浏览器中的事件传播机制。无图无真相,没有配图?那怎么阔以:

  看了图之后相信你已经大概理解了浏览器中的事件传播机制了:当一个事件发生时,它会先从浏览器顶级对象Window一路向下传递,一直传递到触发这个事件的那个元素,这也就是事件捕获过程。然而,一切并没有结束,事件又从这个元素一路向上传递到Window对象,这也就是事件冒泡过程(但是在IE8以及其之前版本中,事件模型并未定义捕获过程,只有冒泡过程)。

  所以,关于上面的问题,还得看元素a注册的事件处理程序是在捕获过程还是在冒泡过程了。那么到底什么是在捕获过程注册事件处理程序,在冒泡过程注册事件处理程序又是怎么做的呢?这就得好好说说几种注册事件处理程序的方式了:

1. 设置HTML标签属性为事件处理程序

  文档元素的事件处理程序属性,其名字由“on”后面跟着事件名组成,例如:onclick、onmouseover。当然了,这种形式只能为DOM元素注册事件处理程序。实例:

结果(鼠标点击div3区域后):

从结果中可以看出:

  ①因为HTML里面不区分大小写,所以这里事件处理程序属性名大写、小写、大小混写均可,属性值就是相应事件处理程序的JavaScript代码;

  ②若给同一元素写多个onclick事件处理属性,浏览器只执行第一个onclick里面的代码,后面的会被忽略;

  ③这种形式是在事件冒泡过程中注册事件处理程序的;

2.设置JavaScript对象属性为事件处理程序

  可以通过设置某一事件目标的事件处理程序属性来为其注册相应的事件处理程序。事件处理程序属性名字由“on”后面跟着事件名组成,例如:onclick、onmouseover。实例:

结果(鼠标点击div3区域后):

从结果中可以看出:

  ①因为JavaScript是严格区分大小写的,所以,这种形式下属性名只能按规定小写;

  ②若给同一元素对象写多个onclick事件处理属性,后面写的会覆盖前面的(ps:这就是在修改一个对象属性的值,属性的值是唯一确定的);

  ③这种形式也是在事件冒泡过程中注册事件处理程序的;

3.addEventListener()

  前两种方式出现在Web初期,众多浏览器都有实现。而addEventListener()方法是标准事件模型中定义的。任何能成为事件目标的对象——这些对象包括Window对象、Document对象和所有文档元素等——都定义了一个名叫addEventListener()的方法,使用这个方法可以为事件目标注册事件处理程序。addEventListener()接受三个参数:第一个参数是要注册处理程序的事件类型,其值是字符串,但并不包括前缀“on”;第二个参数是指当指定类型的事件发生时应该调用的函数;第三个参数是布尔值,其可以忽略(某些旧的浏览器上不能忽略这个参数),默认值为false。这种情况是在事件冒泡过程中注册事件处理程序。当其为true时,就是在事件捕获过程中注册事件处理程序。实例:

结果(鼠标点击div3区域后):

从结果中可以看出:

  ①addEventListener()第三个参数的作用正如上面所说;

  ②通过addEventListener()方法给同一对象注册多个同类型的事件,并不会发生忽略或覆盖,而是会按顺序依次执行;

详解javascript中的事件处理(javascript的)

相对addEventListener()的是removeEventListener()方法,它同样有三个参数,前两个参数自然跟addEventListener()的意义一样,而第三个参数也只需跟相应的addEventListener()的第三个参数保持一致即可,同样可以省略,默认值为false。它表示从对象中删除某个事件处理函数。实例:

4.attachEvent()

  但是,IE8以及其之前版本的浏览器并不支持addEventListener()和removeEventListener()。相应的,IE定义了类似的方法attachEvent()和detachEvent()。因为IE8以及其之前版本浏览器也不支持事件捕获,所以attachEvent()并不能注册捕获过程中的事件处理函数,因此attachEvent()和detachEvent()要求只有两个参数:事件类型和事件处理函数。而且,它们的第一个参数使用了带“on”前缀的事件处理程序属性名。实例:

  相应的,从对象上删除事件处理程序函数使用detachEvent()。例如:

  到此为止,我们已经说了浏览器中事件传播机制以及各种注册事件处理程序的方法。下面我们就再说说事件处理程序调用时的一些问题吧!

二.事件处理程序的调用

1.事件处理程序的参数:正如前面所说,通常事件对象作为参数传递给事件处理函数,但IE8以及其之前版本的浏览器中全局变量event才是事件对象。所以,我们在写相关代码时应该注意兼容性问题。实例(给页面上id为div1的元素添加点击事件,当点击该元素时在控制台输出事件类型和被点击元素本身):

2.事件处理程序的运行环境:关于事件处理程序的运行环境,也就是在事件处理程序中调用上下文(this值)的指向问题,可以看下面四个实例。

实例一:

  结果一:

  从结果可以看出:

    ①第一种方法事件处理程序中this指向这个元素本身;

实例二:

  结果二:

  从结果可以看出:

    ①第二种方法事件处理程序中this也指向这个元素本身;

    ②存在第二种方法时,它会覆盖第一种方法注册的事件处理程序;

实例三:

  结果三:

  从结果可以看出:

    ①第三种方法事件处理程序中this也指向这个元素本身;

    ②第三种方法并不会覆盖第一种或第二种方法注册的事件处理程序;

实例四:

  结果四:

  从结果可以看出:

    ①第四种方法事件处理程序中this指向全局对象Window;

    ②第四种方法也不会覆盖第一种或第二种方法注册的事件处理程序;

3.事件处理程序的调用顺序:多个事件处理程序调用规则如下:

  ①通过HTML属性注册的处理程序和通过设置对象属性的处理程序一直优先调用;

  ②使用addEventListener()注册的处理程序按照它们的注册顺序依次调用;

  ③使用attachEvent()注册的处理程序可能按照任何顺序调用,所以代码不应该依赖于调用顺序;

4.事件取消:

①取消事件的浏览器默认操作(比如点击超链接元素会自动发生页面跳转的默认操作):如果使用前两种方法注册事件处理程序,可以在处理程序中添加返回值false来取消事件的浏览器默认操作。在支持addEventListener()的浏览器中,也可以通过调用事件对象的preventDefault()方法取消事件的默认操作。至于IE8及其之前的浏览器可以通过设置事件对象的returnValue属性为false来取消事件的默认操作。参考代码:

②取消事件传播:在支持addEventListener()的浏览器中,可以调用事件对象的一个stopPropagation()方法阻止事件的继续传播,它能工作在事件传播期间的任何阶段(捕获期阶段、事件目标本身、冒泡阶段);但是在IE8以及其之前版本的浏览器中并不支持stopPropagation()方法,而且这些浏览器也不支持事件传播的捕获阶段,相应的,IE事件对象有一个cancelBubble属性,设置这个属性为true能阻止事件进一步传播(即阻止其冒泡)。参考代码(阻止发生在div3区域的点击事件冒泡到div2和div1):

标签: javascript的

本文链接地址:https://www.jiuchutong.com/biancheng/383682.html 转载请保留说明!

上一篇:javascript如何实现暂停功能(javascript怎么样)

下一篇:浅析javascript中的事件代理(细说javascript)

  • 企业所得税行业所得率
  • 税务机关的义务是依法征管
  • 更正申报后可以作废吗
  • 银行端查询缴税凭证怎么盖章
  • 资本公积和实收资本是什么意思
  • Xm公司为增值税小规模纳税企业
  • 小规模纳税人开具不动产发票税率
  • 公司分立的账务处理凭证怎么做
  • 采购商品的运费计入成本的会计分录
  • 挂靠工程的所得税账务处理怎么做?
  • 社保补助扶持给个人的钱是否需要缴纳个人所得税呢?
  • 企业更名后账务如何处理
  • 从境外取得的佣金
  • 一般代开增值税多少个点?
  • 金蝶软件怎么设置会计科目
  • 借款合同印花税纳税期限
  • 手撕票验旧是什么意思
  • 债务重组损失金额
  • 一般纳税人的资质在哪里打印
  • 赊销方式何时确认收入呢
  • 销售退回发票怎么处理
  • 公司账上没钱还假发工资违法吗
  • 公司投资私募股票有哪些
  • 收到未知款项如何做账
  • 企业分红给企业股东怎么交税
  • 小型微利企业普惠性减税政策
  • 以股权增资的税费怎么算
  • linux命令执行成功后会返回什么
  • 经费开支原则是什么
  • 开增值税专用发票需要什么资料
  • 金蝶固定资产减少怎么做
  • 未办理土地使用权证房屋买卖 案例
  • regsvr32 shmedia.dll
  • 建筑企业分项目信息采集表怎么填
  • 什么是收付实现制?什么是权责发生制?
  • 小规模纳税人免税会计分录
  • Drömling湿地中的灰鹤,德国 (© Mike Friedrichs/Getty Images)
  • 深度学习知识点简单概述【更新中】
  • yolo训练教程
  • XF86Setup命令 设置XFee86
  • 为什么没缴税
  • 增值税专用发票几个点
  • 室内装修专用什么意思
  • 以前年度损益调整结转到本年利润吗
  • 有材料成本差异率怎么算材料成本差异
  • 银行的存单丢失了可以补办吗
  • 定期定额征收和核定征收的哪种税率高
  • 预缴增值税税款所属期
  • 银行季度结息怎么记账
  • 应付账款的发生额怎么算
  • 月末结转销售会计分录
  • 票据贴现无效如何讨要票据款
  • 商业承兑汇票如何承兑?
  • 业务招待费进项票可以抵扣吗
  • 小企业会计准则和一般企业会计准则的区别
  • 公司购药品入什么科目
  • 营销活动费计入成本吗
  • mysql多字段排序原理
  • 微软 win7
  • ubuntu更新软件
  • 系统有乱码怎么解决
  • linux 文字处理
  • win10 win8.1双系统
  • regsrv.exe - regsrv是什么进程 有什么用
  • win7视频播放不了
  • 怎么才能给电脑提速
  • mac怎么卸载苹果系统
  • win10在哪里找
  • excel的exceladdinrd加载项出现问题
  • nodejs bff
  • 断开网络联结的手机
  • nodejs为什么性能这么好
  • unity3D关于公共安全内容制作
  • 安卓打包安装程序apk
  • 湖南税务发票查验平台官网
  • 房地产的土地增值税计入哪个科目
  • 怎么判断买的盐是不是真的
  • 党建 共享
  • 预缴的税额可以用留底抵扣吗
  • 环保税2018年开征文件
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设