事件处理程序

事件处理程序即响应某个事件的函数

事件处理程序以 “on” 开头

如“onclick”,“onload”

HTML事件处理程序

某个元素支持的每种事件都可以使用一个与响应的事件处理程序同名的HTML特性来指定

这个特性的值应该是能够执行的script代码

如:

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

此外也可以直接调用在文档其它部分定义的函数作为事件处理程序所执行的代码

如:

<input type="button" value="click me" onclick="functionClick()"/>

以这样的方式指定事件处理程序会创建一个封装着元素属性值的函数

该函数有一个局部变量 event (事件对象),通过event变量可以访问事件对象

并且在这个函数内部,this指向事件的目标元素

此外,这个动态创建的函数内部可以像访问局部变量一样访问document以及该元素本身的成员

这是因为HTML指定的事件处理函数会像下面这样拓展函数作用域

function(){
with(document){
with(this){
//元素属性值
}
}
}

这样的目的无非是为了让事件处理程序无需引用表单元素就能访问其它表单字段

但是这种方式有以下缺点:

  1. 存在时差问题,即触发事件时事件处理程序可能并不具备执行条件
  2. 这样拓展的事件处理程序作用域链在不同的浏览器可能会导致不同的结果
  3. HTML与JS代码的紧密耦合,使代码的维护成本增加

DOM0级事件处理程序

通过JS指定事件处理程序的传统方式是在第四代web浏览器出现的,只需要将一个函数赋值给事件处理程序属性即可

这种方式一直沿用至今,因为这种方法非常简单并且具备跨浏览器优势

如下所示:

var btn = document.getElementByTagName("button")[0];
btn.onclick = function(){
alert("clicked");
}

使用DOM0级方法指定的事件处理程序被认为是元素方法

因为事件处理程序运行在元素作用域中,所以this引用当前元素

以这种方式定义的事件处理程序会在事件流的冒泡阶段被处理

如果需要删除事件处理程序,只需要将事件处理程序属性的值设为 null 即可

btn.onclick = null;

DOM2级事件处理程序

“DOM级事件”定义了两个方法用于指定和删除事件处理程序

  1. addEventListener()指定事件处理函数
  2. removeEventListener()移除事件处理函数

上面两个方法都接收三个参数

  1. 要处理的事件名
  2. 作为事件处理程序的函数
  3. 布尔值 true 表示在捕获阶段调用事件处理程序  false在冒泡阶段调用事件处理程序

与DOM0级一样DOM2级也是在元素作用域中执行

与DOM0最大的区别在于,DOM2级可以为一个元素添同一事件加多个事件处理程序,而DOM0级重复设置后面的事件处理程序将会覆盖前面的事件处理程序

DOM2级同一元素的同一事件的事件处理程序被事件触发时会按照添加顺序执行

由 addEventListener()添加的事件只能由 removeEventListener()移除

这也意味着,如果addEventListener添加了匿名函数作为事件处理程序将无法被移除

PS.一般来说为了最大限度地保证浏览器兼容,会把事件注册在事件冒泡阶段

IE事件处理程序

IE实现了与DOM中类似地两个方法:

  1. attachEvent()
  2. detachEvent()

这两个方法接收相同的两个参数

  1. 事件名称
  2. 事件处理程序函数

由于低版本IE只支持冒泡,所以这两个方法会将事件处理程序添加到冒泡阶段

这里要注意的是:

  1. 事件名称与DOM不一致列如click事件 addEventListener 使用 “click” 而 attachEvent使用“onclick”
  2. 作用域不同,attachEvent事件添加的函数作用域为全局作用域,所以this等于 window
  3. 多个事件执行顺序不同 与DOM2级相反即与添加事件的顺序相反

跨浏览器事件处理程序

为了隔离浏览器差异,我们可能会使用一些JS库来完成跨浏览器的事件处理程序的兼容

当然我们也可以自己实现

大体实现如下:

// 跨平台事件绑定 参数 1.目标元素 2.目标事件 3.事件处理函数
function addEvent(ele,eve,fun) {
if(ele.addEventListener){
ele.addEventListener(eve,fun,false);
}else if(ele.attachEvent){
ele.attachEvent.call(ele,"on"+eve,fun,false);
}else{
ele["on"+eve] = fun;
}
}
// 跨平台事件移除
function removeEvent(ele,eve,fun) {
if(ele.removeEventListener){
ele.removeEventListener(eve,fun,false);
}else if(ele.detachEvent){
ele.detachEvent.call(ele,"on"+eve,fun,false);
}else{
ele["on"+eve] = null;
}
}

Javascript高级编程学习笔记(58)—— 事件(2)事件处理程序的更多相关文章

  1. Javascript高级编程学习笔记(57)—— 事件(1)事件流

    事件 JS与HTML的交互是通过事件实现的 而事件指的就是:文档或浏览器窗口特定的交互瞬间 可以通过侦听器来预定事件,以便在事件发生时执行相应的代码 这种模式也是设计模式中的观察者模式 事件流 有了事 ...

  2. Javascript高级编程学习笔记(70)—— 事件(14)内存和性能

    由于事件处理程序是现代的web程序交互能力的提供者 所以在日常实践中,我们免不了要向页面中添加大量的事件处理程序(不管是用于用户交互还是用于统计用户数据) 在创建GUI(图形用户界面)的语言(如C#) ...

  3. Javascript高级编程学习笔记(69)—— 事件(13)触摸与手势事件

    触摸与手势事件 由于移动设备既没有鼠标也没有键盘,所以在为移动浏览器开发交互性网页时,常规的鼠标键盘事件根本不够用 所以早期的苹果为Safari 添加了一些与触摸相关的事件 随着后面Android的W ...

  4. Javascript高级编程学习笔记(67)—— 事件(11)HTML5事件

    DOM规范没有涵盖所有浏览器支持的所有事件 而许多浏览器出于满足用户需求,或解决特殊问题的目的,实现了一些自定义事件 HTML5列出了浏览器应该支持的所有事件,这里只讨论得到浏览器完善支持的事件(并非 ...

  5. Javascript高级编程学习笔记(66)—— 事件(10)变动事件

    变动事件 DOM2级的变动事件,能在DOM中的一部分发生变化时给出提示 变动事件是为XML或HTML DOM 设计的,并不特定于某种语言 DOM2级定义了如下变动事件: DOMSubtreeModif ...

  6. Javascript高级编程学习笔记(63)—— 事件(7)鼠标及滚轮事件

    鼠标与滚轮事件 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备 DOM3级事件中定义了9个鼠标事件: click:在用户单击主鼠标按钮(一般为鼠标左键)或者按下回车时触发,这一点对 ...

  7. Javascript高级编程学习笔记(62)—— 事件(6)焦点事件

    焦点事件 焦点事件会在页面元素获得或者失去焦点时触发,利用焦点事件和 document.hasFocus() 方法配合使用 以及 document.activeElement 属性配合可以知晓用户在页 ...

  8. Javascript高级编程学习笔记(61)—— 事件(5)UI事件

    UI事件 UI事件是指那些不一定与用户操作有关的事件 这些事件在DOM规范出现之前,都是以各种不同的形式存在于不同的浏览器 而在DOM事件中为了保证向后兼容,现有的UI事件如下: DOMActivat ...

  9. Javascript高级编程学习笔记(59)—— 事件(3)事件对象

    事件对象 在触发DOM‘事件时,会产生一个事件对象 event 该对象包含着所有与事件有关的信息 所有浏览器都支持 event 对象但是支持的方式有所不同 DOM事件对象 兼容DOM的浏览器会将eve ...

  10. Javascript高级编程学习笔记(68)—— 事件(12)设备事件

    设备事件 随着智能手机与平板电脑的普及,为了更好地让用户与这些设备进行交互 浏览器引入了一种新的方式,而一类新的事件也应运而生,这就是设备事件 W3C从2011年开始制定关于设备事件的草案 下面将会介 ...

随机推荐

  1. 【aardio】如何对listview中某一列,某一行的特定值进行修改?

    用表格创建数组来实现. import win.ui; /*DSG{{*/ var winform = ..win.form( bottom=399;parent=...;right=599;text= ...

  2. canvas的使用方法

    了解canvas:canvas标签是用作图形绘制,但是通过js脚本来实现的,canvas标签其实只是一个容器 ,最终实现绘制功能肯定是通过js脚本实现. 首先肯定要定义一个canvas标签当做容器 & ...

  3. 20172306 2018-2019-2 《Java程序设计与数据结构》第九周学习总结

    20172306 2018-2019-2 <Java程序设计与数据结构>第九周学习总结 教材学习内容总结 无向图 图是由结点和这些结点之间的连接构成 就图来说,结点叫做顶点,结点之间的连接 ...

  4. Maven [ERROR] 不再支持源选项 5。请使用 6 或更高版本

    报错信息如下 解决办法一 在settings.xml文件中指定jdk版本 既可以修改全局的settings.xml文件(C:\Program Files\apache-maven-3.6.0\conf ...

  5. WIN10家庭版的升级到企业版

    1.右键点击[此电脑]---->属性 2.点击[激活windows] 3.在左侧点击[激活]--->更改产品密匙 4.然后输入产品密匙:NPPR9-FWDCX-D2C8J-H872K-2Y ...

  6. 利用WMITool解决Windows10 浏览器主页被hao123劫持问题

    利用Windows10 激活工具KMS10_1025激活系统之后会出现首页 被劫持的问题 解决办法如下 1.下载wmi tool 连接地址 链接: https://pan.baidu.com/s/1g ...

  7. Ubuntu学习之路

    一. Ubuntu简介 Ubuntu(乌班图)是一个基于Debian的以桌面应用为主的Linux操作系统,据说其名称来自非洲南部祖鲁语或科萨语的“ubuntu”一词,意思是“人性”.“我的存在是因为大 ...

  8. css2d 3d

    2D转换 1.rotate()   旋转 <!DOCTYPE html><html> <head> <meta charset="UTF-8&quo ...

  9. Nexus安装、使用说明、问题总结

    Nexus安装.使用说明.问题总结 1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在 ...

  10. 压力测试工具 Apache_jmeter软件配置+TCP示例说明

    该软件jmeter是Apache官方开源压力测试软件.  jmeter官网:http://jmeter.apache.org/  . 本文使用的版本是 3.0版本, 它需要jdk7及以上版本支持. 网 ...