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)

大家都在看

  • Markdown语法

    Markdown语法 1.标题 示例: 这是一级标题 ## 这是二级标题 ### 这是三级标题 #### 这是四级标题 ##### 这是五级标题 ###### 这是六级标题 渲染结…

    技术杂谈 2023年7月24日
    079
  • Aerospike 安装

    Aerospike 安装 posted on2022-02-09 17:42 duanxz 阅读(65 ) 评论() 编辑 Original: https://www.cnblog…

    技术杂谈 2023年5月30日
    095
  • shell内置命令和外部命令的区别

    shell内置命令和外部命令的区别 内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行…

    技术杂谈 2023年7月24日
    070
  • go-切片的追加

    // The append built-in function appends elements to the end of a slice. If // it has suffi…

    技术杂谈 2023年7月11日
    082
  • 苞米面Paddle助手介绍

    自己用的百度飞桨 Paddle,PaddleX 项目模板和小工具。My Paddle PaddleX project templates. 适用系统 一些脚本使用 shell 编写…

    技术杂谈 2023年7月23日
    089
  • Python列表和元组知识点

    list.pop()方法:默认删除列表中最后一个元素,也可按照索引位置删除指定元素,并将删除的元素返回。 li = [23, 4, ‘ab’, True] print(li.pop…

    技术杂谈 2023年6月21日
    084
  • Java线程的6种状态转换

    Java线程的生命周期 与操作系统中线程的五种状态区分开,Java线程有以下6种状态: New 新建 Runnable 可运行 Blocked 阻塞 Waiting 等待 Time…

    技术杂谈 2023年7月24日
    085
  • __declspec(novtable)的用法

    __declspec(novtable) 在C++中接口中广泛应用. 不容易看到它是因为在很多地方它都被定义成为了宏. 比如说ATL活动模板库中的ATL_NO_VTABLE, 其实…

    技术杂谈 2023年7月24日
    085
  • 技能篇:git的简易教程

    在学校,或许凭借一个人的力量就能负责整个项目的开发到上线。但是在公司,因为项目的复杂性和紧急性,一个项目的往往是由多个人实现,此时就有一个问题,代码提交和代码合并。git和svn,…

    技术杂谈 2023年7月25日
    072
  • django系列

    博客园: https://www.cnblogs.com/wupeiqi/articles/5246483.html 全教程: http://c.biancheng.net/dja…

    技术杂谈 2023年7月24日
    071
  • [转帖]kubernetes配置secret拉取私仓镜像

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

    技术杂谈 2023年5月30日
    0100
  • Java 中HashMap详解(含HashTable, ConcurrentHashMap)

    本篇重点: 1.HashMap的存储结构 2.HashMap的put和get操作过程 3.HashMap的扩容 4.关于transient关键字 5.HashMap, HashTa…

    技术杂谈 2023年6月21日
    0108
  • Python实现改进后的Bi-RRT算法实例

    Python实现改进后的Bi-RRT算法实例 1.背景说明 以下代码是参照 上海交通大学海洋工程国家重点实验室《基于改进双向RRT的无人艇局部路径规划算法研究》的算法思想实现的。 …

    技术杂谈 2023年7月24日
    098
  • 注意力机制是什么

    假设有一天热爱绘画的你决定去户外写生,你来到一片山坡上,极目远去,心旷神怡。头顶一片蔚蓝,脚踩一席草绿,远处山川连绵,眼前花草送香,暖阳含羞云后,轻风拂动衣襟,鸟啼虫鸣入耳,美景丹…

    技术杂谈 2023年7月11日
    074
  • Redis缓存雪崩、缓存穿透、缓存击穿

    缓存雪崩 Redis中的缓存数据是有过期时间的,当在同一时间大量的缓存同时失效时就会造成缓存雪崩。解决方案1、设置Redis中的key永不过期,缺点是会占用很多内存2、使用Redi…

    技术杂谈 2023年7月25日
    079
  • 类成员变量的初始化

    1-1 类成员变量初始化的分类 类成员变量的初始化可简单分为两类:非静态成员变量的初始化(以下简称”普通初始化”)和静态成员变量的初始化(”静态…

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