众所周知,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. Codeforces Round #352 (Div. 2) D. Robin Hood (二分答案)

    题目链接:http://codeforces.com/contest/672/problem/D 有n个人,k个操作,每个人有a[i]个物品,每次操作把最富的人那里拿一个物品给最穷的人,问你最后贫富差 ...

  2. 命令行刷机教程( 以Linux系统为例 )

    //第一步adb device // 如果不能cd AndroidSDK/platform-toolsadb kill-server adb start-server //第二步adb reboot ...

  3. 编译小结(6)认识Automake

           我前面说了很多如何用gcc或 Makefile怎么编译的东东,但在Linux下装过软件的都应当见过,很多源码安装的包是用Automake 来编译的.输入下"./configur ...

  4. HCTF2016-杂项签到

    题目下载了一个+_+.pcapng ,用Wireshark打开, Ctrl-F搜索flag 发现python代码 将Data导出 #!/usr/bin/env python # coding:utf- ...

  5. 深入浅出之Smarty模板引擎工作机制(二)

    源代码下载地址:深入浅出之Smarty模板引擎工作机制 接下来根据以下的Smarty模板引擎原理流程图开发一个自己的模板引擎用于学习,以便加深理解. Smarty模板引擎的原理,其实是这么一个过程: ...

  6. ssh 设置免password登录

    如果: 实现->操作机A机 要以用户"user1"身份.免password登录B机和C机? B机和C机 建立用户 user1 而且能够ssh 登录. A机设置: 1.安装ss ...

  7. Codeforces Round #328 (Div. 2) C. The Big Race 数学.lcm

    C. The Big Race Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/592/probl ...

  8. delphi 设置超链接

     的属性 的事件 的方法 //1设置链接类型//2获取样式 链接和提示信息 //title是提示信息//HTTPS https://<a href="https://www.baidu ...

  9. 通过ulimit改善linux系统性能(摘自IBM)

    本文介绍了 ulimit 内键指令的主要功能以及用于改善系统性能的 ulimit 用法.通过这篇文章,读者不仅能够了解 ulimit 所起的作用.而且能够学会怎样更好地通过 ulimit 限制资源的使 ...

  10. MYSQL分页limit速度太慢优化方法

    http://www.fienda.com/archives/110 在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死 ...