JS——事件流与事件处理程序

1.事件流:从页面中接收事件的顺序

1.1 IE :事件冒泡流
1.2 Netscape :事件捕获
1.3 DOM事件流 :事件捕获阶段——事件目标阶段——事件冒泡阶段
DOM2级事件规定 :捕获阶段不会涉及目标事件。

2.事件处理程序

事件 :用户或者浏览器自身执行的 某种动作
事件处理程序 :响应某个事件的 函数 。

2.1 HTML事件处理程序

用一个与该事件处理程序同名的HTML特性来指定。

2.1.1包含要执行的具体动作

2.1.2 调用其他地方定义的脚本

2.1.3 缺点

1.时差问题:使用try-catch块捕捉错误。onclick=”try { showMessage() ;} catch(ex) {} ”
2.程序的作用域链在不同浏览器中会导致不同结果
3.HTML和JS代码耦合紧密

2.2 DOM0级事件处理程序

将一个函数赋值给一个事件处理程序属性,例如:onclick。
为事件处理程序赋值。

btn.onclick = <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">function<span class="hljs-params"><span class="hljs-function">(<span class="hljs-params">)<span class="hljs-function"> {
    alert( <span class="hljs-keyword">this.id );
};</span></span></span></span></span></span></span></span></span>

事件处理程序在元素的作用域中运行,this指向当前元素。
删除事件处理程序:
btn.onclick = null;

2.3 DOM2级事件处理程序

addEventListener(处理的事件名,事件处理程序函数,布尔值);
removeEventListener(处理的事件名,事件处理程序函数,布尔值);
布尔值:捕获阶段调用事件处理程序:true。冒泡阶段调用:false。大多数情况下用false。

btn.addEventListener(&#x201C;click&#x201D; , <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">function<span class="hljs-params"><span class="hljs-function">(<span class="hljs-params">)<span class="hljs-function"> {
    alert(<span class="hljs-keyword">this.id);
}, <span class="hljs-literal">false);</span></span></span></span></span></span></span></span></span></span>

好处:可以添加多个事件处理程序。事件按照添加先后顺序执行。
问题:匿名函数无法移除。
最好写成

<span class="hljs-keyword">var handler = <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">function<span class="hljs-params"><span class="hljs-function">(<span class="hljs-params">){
    alert(<span class="hljs-keyword">this.id);
};
btn.addEventListener(&#x201C;click&#x201D;, handler, <span class="hljs-literal">false);
btn.removeEventListener(&#x201C;click&#x201D;, handler, <span class="hljs-literal">false);</span></span></span></span></span></span></span></span></span></span></span>

2.4 IE事件处理程序

attachEvent(事件处理程序名称,事件处理程序函数);
detachEvent(事件处理程序名称,事件处理程序函数);

通过该方法添加的事件处理程序,都会被添加到冒泡阶段。

btn.attachEvent(&#x201C;onclick&#x201D;,<span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">function<span class="hljs-params"><span class="hljs-function">(<span class="hljs-params">){
    alert(&#x201C;clicked&#x201D;);
});</span></span></span></span></span></span></span>

注意:使用DOM级方法时,事件会在所属元素的作用域内运行;使用attachEvent()方法,事件处理程序会在全局作用域运行,this==window。
好处:可以添加多个事件处理程序。后添加先执行。
问题:匿名函数无法移除。

<span class="hljs-keyword">var handler = <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">){
    alert(<span class="hljs-keyword">this.id)</span></span></span></span></span>

2.5跨浏览器事件处理程序

1.创建一个方法addHandler():区分使用哪种方法来添加事件;
2.创建一个对象EventUtil。拥有两个方法。
3.addHandler(要操作的元素,事件名称,事件处理函数)。
4.removeHandler(要操作的元素,事件名称,事件处理函数)。

var EventUtil = {
    addHandler: <span class="hljs-keyword">function(element,<span class="hljs-class"><span class="hljs-keyword"><span class="hljs-built_in">type,<span class="hljs-title">handler){
        <span class="hljs-keyword">if(element.addEventLister) {
            element.addEventListener(<span class="hljs-class"><span class="hljs-keyword"><span class="hljs-built_in">type,<span class="hljs-title">handler,<span class="hljs-title"><span class="hljs-literal">false);
        } <span class="hljs-keyword">else <span class="hljs-keyword">if(element.attachEvent) {
            element.attachEvent(<span class="hljs-string">"on"+<span class="hljs-class"><span class="hljs-keyword"><span class="hljs-built_in">type, <span class="hljs-title">handler);
        }<span class="hljs-keyword">else {
            element.[<span class="hljs-string">"on"+<span class="hljs-class"><span class="hljs-keyword"><span class="hljs-built_in">type] =handler;
        }
    },
    removeHandler: <span class="hljs-keyword">function(element,<span class="hljs-class"><span class="hljs-keyword"><span class="hljs-built_in">type,<span class="hljs-title">handler){
        <span class="hljs-keyword">if(element.addEventLister) {
            element.removeEventListener(<span class="hljs-class"><span class="hljs-keyword"><span class="hljs-built_in">type,<span class="hljs-title">handler,<span class="hljs-title"><span class="hljs-literal">false);
        } <span class="hljs-keyword">else <span class="hljs-keyword">if(element.attachEvent) {
            element.detachEvent(<span class="hljs-string">"on"+<span class="hljs-class"><span class="hljs-keyword"><span class="hljs-built_in">type, <span class="hljs-title">handler);
        }<span class="hljs-keyword">else {
            element.[<span class="hljs-string">"on"+<span class="hljs-class"><span class="hljs-keyword"><span class="hljs-built_in">type] = <span class="hljs-keyword">null;
        }
    }
};</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

使用:

EventUtil.<span class="hljs-keyword">addHandler(btn ,&#x201D;click&#x201D;,<span class="hljs-keyword">handler)</span></span>

Original: https://www.cnblogs.com/libin-1/p/7712807.html
Author: 最骚的就是你
Title: JS——事件流与事件处理程序

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/549072/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 驱动开发之基本数据结构

    根据MSDN的介绍,自己对一些基本结构做一些翻译,帮助自己理解。 指向驱动创建的设备对象的指针。当驱动成功调用IoCreateDevice时,这个成员会自动更新。驱动可以用这个成员…

    技术杂谈 2023年7月11日
    067
  • docker安装nacos 1.x版本

    修改配置文件 server.contextPath=/nacos server.servlet.contextPath=/nacos server.port=8848 spring…

    技术杂谈 2023年7月24日
    068
  • OpenSSL命令—pkcs12

    用途: pkcs12文件工具,能生成和分析pkcs12文件。PKCS#12文件可以被用于多个项目,例如包含Netscape、MSIE和MS Outlook。 用法: openssl…

    技术杂谈 2023年5月31日
    0100
  • ant design mini

    外包项目可以找我,前端后端一锅端,作者:漫思,转载请注明原文链接:https://www.cnblogs.com/sexintercourse/p/16551655.html 如有…

    技术杂谈 2023年6月1日
    0100
  • python 对潜在客户数据集 进行数据分析

    大家好,我是小寒。 今天给大家带来一篇 探索性数据分析(EDA) 案例分享。如果觉得不错,可以多多分享。 什么是探索性数据分析 探索性数据分析 (EDA) 是任何数据科学或数据分析…

    技术杂谈 2023年7月25日
    079
  • quartz框架(五)-Trigger相关内容

    上篇博文,博主介绍了Job的相关内容。本篇博文,博主将介绍Trigger相关的内容。 Trigger是触发器的意思,它只定义Trigger相关属性的Get方法。一个Trigger只…

    技术杂谈 2023年7月24日
    069
  • 获得图片的圆形头像效果

    一张矩形的图片,怎样得到圆形的头像效果? img { border: 3px solid #cccccc; border-radius: 50%; height: 80px; wi…

    技术杂谈 2023年5月31日
    095
  • pycharm可以运行但无法debug的解决方法

    错误信息:pydev debugger: process 4588 is connecting 如果您尝试了网上的很多方法如防火墙设置,去掉 “.idea”…

    技术杂谈 2023年6月21日
    092
  • mysql扫描全表更新状态部分失败

    一直以为mysql是按照主键排序的,实则排序和主键没有关系(不使用 order by 子句)。 然后从 stackoverflow 上查了一下,找到了以下的回答: 没有默认的排序顺…

    技术杂谈 2023年7月25日
    077
  • 定制化知识图谱 项目介绍

    宣传网站 http://dingzhitupu.com/ 定制化知识图谱 根据您的业务特性,通过图分析、建模,创建专门适合与您业务逻辑的专有知识图谱 特性介绍 用户不必懂相关技术 …

    技术杂谈 2023年5月31日
    0108
  • Clash配置TUN模式和TAP模式

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年5月30日
    0149
  • git学习(一)-fork操作

    fork操作 对于某一个项目来说,如果自己不属于开发者中的一员,那么只能先fork别人的代码,然后将代码拉取到本地进行修改之后,再向原来的项目发起pull request。 for…

    技术杂谈 2023年7月24日
    090
  • vue辅助函数mapState和mapGetter前面三个点到底是什么意思:对象展开运算符

    mapState 函数返回的是一个对象。我们如何将它与局部计算属性混合使用呢? 通常,我们需要使用一个工具函数将多个对象合并为一个,以使我们可以将最终对象传给 computed 属…

    技术杂谈 2023年6月1日
    088
  • Java开发之JavaWeb速成 —- 第二部分

    JavaWeb速成 前言 以最少时间,快速学完各知识点。知识点围绕概念,作用,使用方法来写,适合有javaweb基础的人复习 旨在快速入手/复习,放实例显得冗余,所以实例代码会以截…

    技术杂谈 2023年7月24日
    068
  • 高效能研发体系构建概论【原创】

    背景 技术管理者(技术总监/经理/CTO)都会面临公司战略执行,公司业绩的压力,以及业务对技术团队支撑能力的期望和诉求。如何打造一支快速响应,高效能,能打硬仗的技术团队?是技术管理…

    技术杂谈 2023年7月23日
    077
  • 基于AudioQueue实现音频的录制和播放

    基于AudioQueue实现音频的录制和播放 @ 基于AudioQueue实现音频的录制和播放 背景 总览 Audio Queue 架构 AudioQueueBuffer数据结构 …

    技术杂谈 2023年7月25日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球