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)

大家都在看

  • Flink Checkpoint & Savepoint

    Checkpoint是Flink实现容错机制最核心的功能,能够根据配置周期性地基于Stream中各个Operator的状态来生成Snapshot,从而将这些状态数据定期持久化存储下…

    技术杂谈 2023年7月10日
    076
  • cookie和session

    当客户端访问时,服务端会为客户端生成一个 Cookie键值对数据,通过 Response响应给到客户端。当下一次客户端继续访问相同的服务端时,浏览器客户端就会将这个 Cookie值…

    技术杂谈 2023年6月21日
    088
  • c++多继承多态

    C++多继承多态的实现 如果一个类中存在虚函数,在声明类的对象时,编译器就会给该对象生成一个虚函数指针,该虚函数指针指向该类对应的虚函数表。多态的实现是因为使用了一种动态绑定的机制…

    技术杂谈 2023年6月21日
    078
  • 如何在 30 分钟完成表格增删改查的前后端框架搭建

    30分钟,你可以做什么?可以风卷残云的饱餐一顿;可以简单地打扫一下房间;或者可以跳10十遍刘畊宏《本草纲目》毽子操。而今天,本葡萄要带你在30分钟内完成一套拥有增删改查表格系统的前…

    技术杂谈 2023年5月31日
    085
  • api接口基础Day2

    十六进制的权: 16的0次幂————-1 16的1次幂————-16 16的2次幂————-256 16的3次幂———-…

    技术杂谈 2023年7月10日
    093
  • 透视矩阵的推导(最直观、最深入、最还原,看完请点赞。)

    由參数l,r,b,t,n,f定义的透视投影矩阵的推导困惑了我差点儿相同一个多礼拜。这几天差点儿是天天都在思考这个问题。昨天晚上3点多钟我突然醒了,然后我又開始想这个问题,结果最终让…

    技术杂谈 2023年5月31日
    071
  • IO复用三种方式

    IO复用技术,简单来说就是同时监听多个描述符。在没有用到IO复用以前,只能是一个线程或一个线程去监听,服务端同时有多个连接的时候,需要创建多个线程或者进程。而且,并不是所有的连接是…

    技术杂谈 2023年6月21日
    093
  • 深入理解Apollo核心机制之灰度发布——创建灰度

    概述 ApolloPortal创建灰度后都做了什么呢?Apollo是如何维护主版本与灰度版本关系的呢? 其实创建灰度非常简单,可以看到下图中”Cluster&#8221…

    技术杂谈 2023年7月25日
    067
  • 基础设施公募REITs介绍

    一、REITs的发展历史 作为舶来品,REITs的发行和投资在海外市场已较为成熟,REITs也是大类资产配置中的重要品种。 在欧美的语境下,REITs即房地产信托投资基金,是通过汇…

    技术杂谈 2023年5月31日
    072
  • springboot启动报错BeanCreationException

    springboot程序启动报错,数据库连接错误。检查了一下网络,发现是wiki连错了,改一下即可,嘿嘿。错误信息:Failed to initialize pool: Commu…

    技术杂谈 2023年7月11日
    054
  • String和List相互转换

    1,String转List csharp;gutter:true; //常见的为逗号分隔 String str = "a,b,c"; List list1 = …

    技术杂谈 2023年5月31日
    072
  • 关于计算两日期之间经过多少天的超巧妙算法

    首先声明:本文引自一博主原创博客 昨天呢,刚刚阅读了这个代码,大部分都还可以看懂,有一两个地方属实难懂,但细细思来,方知博主此代码超神奇。简直巧妙至极。 所以来细细解析一下此代码。…

    技术杂谈 2023年7月23日
    0156
  • 新人公司选择及进入公司后注意事项

    公司/平台选择 优先选择走在未来航道上的那些 快速发展的公司 确认所选公司是否是一家 以技术驱动,以技术文化为主导的公司 新人进入公司后要注意 一般的开发流程是:需求分析➡️设计➡…

    技术杂谈 2023年7月25日
    079
  • HashMap原理及源码分析

    HashMap 原理及源码分析 1. 存储结构 HashMap 内部是由 Node 类型的数组实现的。 Node 包含着键值对,内部有四个字段,从 next 字段我们可以看出, N…

    技术杂谈 2023年7月24日
    065
  • 2022.22 如何提升技术能力

    最近,看到文章《关于技术能力的思考和总结》,里面的一些点还是值得技术人反思学习的。 对于什么是技术能力,作者提炼了一个模型如下: 首先,技术人要通过练掌握术,提升技术能力,成为团队…

    技术杂谈 2023年5月30日
    090
  • ds 校验某一个必填项字段

    场景: 通过 Step 组件,两个步骤中 Form,共用同一个 ds,希望步骤一中的指定字段没有填写时,禁止跳转下一步 思路: 通过 ds.checkValidity(record…

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