click,load,mouseover都是事件的名字,而响应某个事件的函数就叫做事件处理程序(或事件侦听器)。事件处理程序的名字以'on'开头,onclick,onload

事件处理程序(html事件处理程序,dom0级事件处理程序,dom2级事件处理程序,ie事件处理程序,跨浏览器事件处理程序)

html事件处理程序

1、内置js

<input type='button' value='click me' onclick='alert("clicked")'/>

当点击这个按钮时,就会显示一个警示框
注意:不能在其中使用未经转义的html语法字符 例如双引号(""),小于号(<),大于号(>)。

<input type='button' value='click me' onclick='alert("clicked")'/>

2、函数调用

<script type='text/javascript'>function showMessage(){alert('Hello world');}
</script>
<input type='button' value='click me' οnclick='showMessage()'/>

事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码

3、其他

<input type='button' value='click me' onclick='alert(value)'/>
=
<input type='button' value='click me' onclick='alert(this.value)'/>

this值等于事件的目标元素

<input type='button' value='click me' onclick='alert(event.type)'/>

通过event变量,可以直接访问事件对象,不用自己定义它

<form action="" post='post'><input type='text' value='click me' name='username'/><input type='button' value='click me' onclick='alert(username.value)'/>
</form>

扩展作用域,让事件处理程序无需引用表单元素就能访问其他表单字段

html事件处理程序的缺点:
1、如果用户在html元素一出现在页面上就触发相应的事件,但当时的事件处理程序有可能尚不具备执行条件。
2、这样扩展事件处理程序的作用域链在不同浏览器中会导致不同的结果,不同js引擎遵循的标识符解析规则略有差异,很可能会在访问非限定对象成员时出错。
3、html与js代码紧密耦合。如果要更换事件处理程序,就要改动两个地方:html代码和js代码。

DOM0级事件处理程序

通过js指定事件处理程序的传统方式,就是将一个函数赋值给一个事件处理程序属性。eg:

 <script>var btn = document.getElementById('myBtn');btn.onclick=function(){alert('clicked');}
</script>
<input type='button' value='click me' id='myBtn'/>

使用dom0级方法指定的事件处理程序被认为是元素的方法。因此,这时候的事件处理程序是在元素的作用域中运行;换句话说,程序中通过this引用当前元素

var btn = document.getElementById('myBtn');
btn.onclick=function(){alert(this.id);
}

在事件处理程序中通过this访问元素的任何属性和方法。以这种方式添加的事件处理程序会在事件流的冒泡阶段被处理

btn.onclick = null;//删除事件处理程序

将事件处理程序设置为null后,再单击按钮将不会有任何动作发生

DOM2级事件处理程序

var btn = document.getElementById('myBtn');
btn.addEventListener('click',function(){alert(this.id);
},false)

DOM2级事件定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventListener();所有dom都包含这两个方法,并且它们都接受3个参数:
要处理的事件名
作为事件处理程序的函数
一个布尔值(true表示捕获阶段调用事件处理程序,false表示冒泡阶段调用事件处理程序)
特点:
1、与dom0级一样,这里添加的事件处理程序依附在作用域中运行(要先加载dom,再加载js)
2、可以添加多个事件处理程序

var btn = document.getElementById('myBtn');
btn.addEventListener('click',function(){alert(this.id);
},false)
btn.addEventListener('click',function(){alert('Hello world');
},false)

3、通过addEventListener()添加的事件处理程序只能使用removeEventListener()移除,移除时传入的参数与添加处理程序时的参数相同,这也意味着addEventListener()添加的匿名函数将无法移除

var btn = document.getElementById('myBtn');
btn.addEventListener('click',function(){alert(this.id);
},false)//省略其它代码

btn.removeEventListener('click',function(){  //没有用alert(this.id);
},false)

看似使用了相同的参数,实际上,第二个参数与传入的那个时完全不同的函数

var btn = document.getElementById('myBtn');
var handler = function(){alert(this.tid)
}
btn.addEventListener('click',handler,false)//省略其它代码

btn.removeEventListener('click',handler,false);//有效

IE事件处理程序

IE实现了与DOM中类似的两个方法:attachEvent()和detachEvent()。这两个方法接受相同的两个参数:事件处理程序名称与事件处理程序函数,由于IE8及更早版本支持事件冒泡,所以通过attachEvent()添加的事件处理程序都会被添加到冒泡阶段

var btn = document.getElementById('myBtn');
btn.attachEvent('onclick',function(){alert('Clicked'); alert(this === window); //true
})
btn.attachEvent('onclick',function(){alert('Hello World');
})

注意:
1、dom0在其所属元素的作用域内运行,使用attachEvent()方法的情况下,事件处理程序会在全局作用中运行,this等于window,如果在编写跨浏览器的代码时,牢记这一区别非常重要
2、与addEventListener类似,可以为一个元素添加多个事件处理程序
3、与dom不同的是,这些事件处理程序不是以添加它们的顺序执行,而是以相反的顺序被触发,单机这个例子,首先会看到hello world,然后才是clicked
4、使用attachEvent()添加的事件可以通过detachEvent()来移除,条件是必须提供相同的参数。与DOM方法一样,这也意味着添加的匿名函数将不能被移除

var btn = document.getElementById('myBtn');
var handler = function(){alert('Clicked');
}
btn.attachEvent('onclick',handler);
//这里省略了其他代码
btn.detachEvent('onclick',handler);

跨浏览器的事件处理程序

要保证处理事件的代码能在大多数浏览器下一致运行,只需关注冒泡阶段。第一个要创建的方法是addHandler(),它的职责视情况分别使用dom0级方法、dom2级方法或ie方法来添加事件

var EventUtil = {addHandler:function(element,type,handler){if(element.addEventListener){element.addEventListener(type,handler,false);}else if(element.attachEvent){element.attachEvent('on'+type,handler)}else{element['on'+type] = handler;}},removeHandler:function(element,type,handler){if(element.removeEventListener){element.removeEventListener(type,handler,false);}else if(element.detachEvent){element.detachEvent('on'+type,handler);}else{element['on'+type] = null;}}
}

转载于:https://www.cnblogs.com/wzndkj/p/7907048.html

事件(二):事件处理程序相关推荐

  1. 2020.11.18第十三章 事件(事件处理程序;事件对象;事件类型:UI事件;焦点事件;鼠标与键盘事件 变动事件 模拟事件)

    事件处理程序 html事件处理程序(直接在html中书写script) <!-- //#### 事件处理程序 //html时间程序 可以直接在HTML文件中写,而且还可以引用其他地方的方法和函数 ...

  2. DDD(Domain-Driven Design)领域驱动设计-(二)事件风暴

    本节及后边的章节都以实际的例子进行描述,并且完整的按照DDD的流程实现该系统 题目如下: 背景介绍 一个面向学校师生的网上考试系统 需求描述 1.老师可以创建一门课程○一门课程包含多个视频和一场考试 ...

  3. javascript二——事件

    文章目录 注册事件(绑定事件) addEventListener 事件监听方式 删除事件(解绑事件) 删除事件的方式 DOM事件流 事件对象 事件对象的常见属性和方法 事件阻止默认行为 阻止事件冒泡 ...

  4. C#事件-使用事件需要的步骤

    事件是C#中另一高级概念,使用方法和委托相关.奥运会参加百米的田径运动员听到枪声,比赛立即进行.其中枪声是事件,而运动员比赛就是这个事件发生后的动作.不参加该项比赛的人对枪声没有反应. 从程序员的角度 ...

  5. JQ 为未来元素添加事件处理器—事件委托

    随着DOM结构的复杂化和Ajax等动态脚本技术的运用,有了较多的动态添加进来的元素,直接用JQ添加click事件会发现新添加进来的元素并不能直接选取到,在这里就需要用到事件委托方法,JQ为事件委托提供 ...

  6. a标签点击事件_DOM事件机制

    前言 本文主要介绍DOM事件级别.DOM事件模型.事件流.事件代理和Event对象常见的应用,希望对你们有些帮助和启发! 一.DOM事件级别 DOM级别一共可以分为四个级别:DOM0级.DOM1级.D ...

  7. JS中的事件委托/事件代理详解

    起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...

  8. mouseenter事件java_javaScript事件(五)事件类型之鼠标事件

    一.事件 二.事件流 三.事件处理程序 四.IE事件处理程序 五.事件对象 六.事件对象的公共成员 七.鼠标事件 DOM3级事件中定义了9个鼠标事件. mousedown:鼠标按钮被按下(左键或者右键 ...

  9. 移动端事件--touch事件的分类、touch事件的event对象、 其他触摸事件

    一.touch事件的分类 1.1 触摸事件(touch) .box {width: 150px;height: 150px;background-color: red;margin: 20px aut ...

  10. DDD~领域事件与事件总线

    DDD~领域事件与事件总线 回到目录 谈谈它 终于有些眉目了,搜刮了很多牛人的资料,英文的,中文的,民国文的,终于小有成就了,同时也做了个DEMO,领域事件这东西好,但需要你明白它之后才会说好,而对于 ...

最新文章

  1. 黄聪:VS2010开发T4模版引擎之基础入门
  2. [转载]无需软件合并多个TS流文件
  3. vue进行判断使用class_vue如何判断dom的class
  4. Docker 学习资料汇总
  5. git/ TortoiseGit 在bitbucket.org 使用证书登陆
  6. mysql的一些函数
  7. Javascript设计模式之发布-订阅模式
  8. 抖音回应视频泄露:草稿不会上传后台;苹果开卖5000元印度版iPhone XR;Jboot 2.2.5发布|极客头条...
  9. webService调用模式比较
  10. python如何检查错误-python中的错误如何查看
  11. 位图BitMap大数据筛选
  12. maven编译,控制台中文乱码解决方案
  13. C#获取cpu序列号 硬盘ID 网卡硬地址以及操作注册表 .
  14. python的简洁运算符_Python实现的简单算术游戏实例 python中算数运算符都有哪些...
  15. 超级推荐!!值得收藏的黑客系列书:《黑客攻防实战xx》系列图书简介,一共4本
  16. python设计棋牌游戏
  17. 主成分与因子分析异同_主成分分析和因子分析有什么区别?
  18. Android 实现 iBeacon
  19. 减法公式运算法则_减法的运算法则
  20. SpringBoot 实现大文件视频转码(转码基于FFMPEG实现)

热门文章

  1. mysql表单查询_表单查询实例
  2. php解析xml数据格式,PHP解析xml格式数据工具类实例分享
  3. .net get set 初始化_.NET项目升级:可为空引用
  4. LeetCode 326. 3的幂
  5. LeetCode 第 19 场双周赛(231 / 1120,前20.6%)
  6. 江小白包装设计原型_雪碧和江小白的品牌跨界合作之旅可谓是一场品牌包装的视觉盛宴...
  7. python求矩阵的秩_Python 实现线性代数计算器
  8. java星座测试需求分析_java十二星座 (快来测试你是什么星座吧)
  9. java的foeachr循环_for循环和Dowhile循环的应用
  10. windows副本不是正版怎么解决_解决Windows沙盒怎么联网问题