众所周知,web前端包含三个基本技术:html、css和javascript。三者融合,才让网页变得精彩纷呈!如今,web上的操作越来越趋于复杂,JavaScript事件在网页中也遍地开花,有时候也是遍地生Bug。真正理解了JavaScript的事件模型,才能在实际开发中佛挡杀佛,bug挡杀bug。

前言

这是我自己对JavaScript事件模型的理解,并且参考了网络上的各家之言。由于本人才疏学浅,难免有错误之处,还望指正。

在工作学习中,你或许不知道见过多少事件了。那么,到底什么是JavaScript事件呢?我们先来运行一段代码:

var out = [];
for ( var i in window) {
if ( /^on/.test(i)) { out[out.length] = i; }
}
console.log(out);

是不是看到了如下一大串东西(我是在chrome中运行的)?

["onautocompleteerror", "onautocomplete", "ondeviceorientation", "ondevicemotion", "onunload", "onstorage", "onpopstate", "onpageshow", "onpagehide", "ononline", "onoffline", "onmessage", "onlanguagechange", "onhashchange", "onbeforeunload", "onwaiting", "onvolumechange", "ontoggle", "ontimeupdate", "onsuspend", "onsubmit", "onstalled", "onshow", "onselect", "onseeking", "onseeked", "onscroll", "onresize", "onreset", "onratechange", "onprogress", "onplaying", "onplay", "onpause", "onmousewheel", "onmouseup", "onmouseover", "onmouseout", "onmousemove", "onmouseleave", "onmouseenter", "onmousedown", "onloadstart", "onloadedmetadata", "onloadeddata", "onload", "onkeyup", "onkeypress", "onkeydown", "oninvalid", "oninput", "onfocus", "onerror", "onended", "onemptied", "ondurationchange", "ondrop", "ondragstart", "ondragover", "ondragleave", "ondragenter", "ondragend", "ondrag", "ondblclick", "oncuechange", "oncontextmenu", "onclose", "onclick", "onchange", "oncanplaythrough", "oncanplay", "oncancel", "onblur", "onabort", "onwheel", "onwebkittransitionend", "onwebkitanimationstart", "onwebkitanimationiteration", "onwebkitanimationend", "ontransitionend", "onsearch"]

没错,这些都是JavaScript事件!但也不仅仅是这些。

DOM1级事件处理

为什么不是DOM0级事件,以为DOM0级规范压根就没有形成。DOM1级事件处理是当今所有浏览器都支持的事件处理,不存在任何兼容性问题,。DOM0事件处理的规则:每个DOM元素都有自己的事件处理属性,该属性可以赋值一个函数,例如:

var btnDOM = document.getElementById("btn");
btnDOM.onclick = function(){
alert("you click me!");
}

DOM0级事件处理的事件属性都是采用“on+事件名称”的方式定义,整个属性都是小写字母。DOM元素在JavaScript代码是作为对象处理的,例如:

btnDOM.onclick = null;

那么按钮的点击事件被取消了。

DOM1级事件可以被覆盖,例如:

btnDOM.onclick = function(){
alert(" you click me!");
}
btnDOM.onclick = function(){
alert("also click me!");
}

后面一个函数会将第一个函数覆盖。

DOM2级事件处理(IE9及其以上支持)

首先说说事件流。事件流描述的是从页面中接收事件的顺序。早期的IE事件流叫做事件冒泡,Netscape团队提出的是事件捕获。

如下图:

而现在常用的DOM2级事件流(也称标准事件模型)是包括了三个阶段:事件捕获阶段,处于目标阶段和事件冒泡阶段。

如下图:

DOM2事件处理里添加事件使用的是addEventListener,它接收三个参数,第三个参数默认为false,表示在冒泡阶段调用事件处理程序。如果设为true,则表示在事件捕获阶段处理程序。

var btnDOM = document.getElementById("btn");
btnDOM.addEventListener("click",function(){
alert("Click Me!");
},false);
var ftn = function(){
alert("Click Me,too!");
};
btnDOM.addEventListener("click",ftn,false);

删除事件使用removeEventListener,其中参数要和定义事件的参数一致,第三个参数不传,默认是删除冒泡事件,因为第三个参数不传默认都是false,例如下面的代码是不能成功删除事件的:

btnDOM.addEventListener("click",ftn,true);
btnDOM.removeEventListener("click",ftn);

事件冒泡有时候并不是我们所想要的。所以我们需要来阻止事件冒泡,标准方法是:

event.stopPropagation();

IE 可能会使用到下面这个方法:

event.cancelBubble = true;

事件对象event里面存在target和currentTarget。我们知道事件其实是观察者模式。target其实是事件的发布者(event dispatcher),currentTarget是事件的处理者(event processor)。

说明:

  1. target发生在事件流的目标阶段,而currentTarget发生在事件流的整个阶段(捕获、目标和冒泡阶段)
  2. 只有当事件流处于目标阶段的时候二者才相同
  3. 而当事件流处于捕获和冒泡阶段时,target指向被点击的对象,而currentTarget指向当前事件活动的对象。

知道了这个原理,我们便可以理解事件委托(也称事件代理)的实现原理了。

DOM3及DOM4事件处理

这是未来的事情了。

谈谈JavaScript事件的更多相关文章

  1. Javascript事件模型系列(四)我所理解的javascript自定义事件

    被我拖延了将近一个月的javascript事件模型系列终于迎来了第四篇,也是我计划中的最后一篇,说来太惭愧了,本来计划一到两个星期写完的,谁知中间遇到了很多事情,公司的个人的,搞的自己心烦意乱浮躁了一 ...

  2. 谈谈javaScript

    谈谈javaScript  (杰我学习) 一. 什么是JavaScript       人们通常所说的JavaScript,其正式名称为ECMAScript.这个标准由ECMA组织发展和维护.ECMA ...

  3. JavaScript事件代理和委托(Delegation)

    JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委 ...

  4. JavaScript事件概览

    JavaScript事件 JavaScript是单线程,在同一个时间点,不可能同时运行两个"控制线程". 事件句柄和事件对象 1.注册事件句柄 标准和非标准 var button= ...

  5. 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)

    前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...

  6. JavaScript 事件

    事件 概念:事件是可以被 JavaScript 侦测到的行为. JavaScript 使我们有能力创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触 ...

  7. JavaScript事件详解-jQuery的事件实现(三)

    正文 本文所涉及到的jQuery版本是3.1.1,可以在压缩包中找到event模块.该篇算是阅读笔记,jQuery代码太长.... Dean Edward的addEvent.js 相对于zepto的e ...

  8. JavaScript事件详解-Zepto的事件实现(二)【新增fastclick阅读笔记】

    正文 作者打字速度实在不咋地,源码部分就用图片代替了,都是截图,本文讲解的Zepto版本是1.2.0,在该版本中的event模块与1.1.6基本一致.此文的fastclick理解上在看过博客园各个大神 ...

  9. 总结JavaScript事件机制

    JavaScript事件模型 在各种浏览器中存在三种事件模型: 原始事件模型 , DOM2事件模型 , IE事件模型. 其中原始的事件模型被所有浏览器所支持,而DOM2中所定义的事件模型目前被除了IE ...

随机推荐

  1. C#中ArrayList和string,string[]数组的转换

    转载原地址: http://www.cnblogs.com/nextsoft/articles/2218689.html 1.ArrarList 转换为 string[] : ArrayList li ...

  2. PAC(Proxy Auto Config)代理自动配置文件的编写

    Proxy Auto Config文件格式说明 PAC文件实际上是一个Script, 通过PAC我们可以让系统根据情况判断使用哪一个Proxy来访问目标网址, 这样做的好处: 分散Proxy的流量,避 ...

  3. 离散信号MATLAB频谱分析程序

    from http://blog.csdn.net/u012129372/article/details/26565611 %FFT变换,获得采样数据基本信息,时域图,频域图 %这里的向量都用行向量, ...

  4. 剑指OFFER之数值的整数次方(九度OJ1514)

    题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 输入: 输入可能包含多个测试样例.对于每个输入文件,第一行输入一个整数T,表 ...

  5. CentOS 6.5部署HTTP WEB服务器和FTP服务器

    转载自:http://www.server110.com/linux/201403/8613.html [题记]本文使用CentOS 6.5 minimal快速搭建HTTP服务器和仅供授权用户登陆的F ...

  6. 译 - 第 1 章:EF入门

    章节信息 Entity Framework 6 Recipes 第二版第一章: Chapter 1: Getting Started with Entity Framework ----------- ...

  7. 【转】Rails 3.1错误-Could not find a JavaScript runtime及execjs和therubyracer介绍

    转自:http://rubyer.me/blog/740/ Rails 3.1错误 /gems/execjs-1.1.2/lib/ execjs/runtimes.rb:43:in `autodete ...

  8. Git Cmd

    http://my.oschina.net/sunboy2050/blog/55749

  9. BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元

    1013: [JSOI2008]球形空间产生器sphere Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/Judg ...

  10. [MODx] 3. Working with chunks, TV, Category

    1. Add chunk: For example, replace the header by using chunk. Usage: [[$chunk_name]] Cut all the hea ...