事件流

事件流描述的是页面接收事件的顺序.IE的事件流是冒泡流,而 Netscape Communicator的事件流是事件捕获流.

事件冒泡是指事件开始时由最具体的元素,然后向上传播到较为不具体的节点.所有现代浏览器都支持事件冒泡,IE9,Firefox,chrome,safari则将事件一直冒泡到window对象.

事件捕获是不太具体的节点应该更早接收到事件,而具体的节点应该最后接收到事件.

DOM事件流
DOM2级事件流规定的事件流包括三个阶段: 事件捕获阶段 处于目标阶段 事件冒泡阶段

事件处理程序

HTML事件处理程序

on+事件名(例如onclick)作为事件目标的属性,属性值为事件处理程序,在html中定义的事件处理程序可以包含要执行的具体动作,也可以调用页面其他地方定义的脚本.

<input type="button" value='click me' onclick="alert('Clicked');"/>
<input type="button" value="click me" onclick="showMessage()"/>
function showMessage(){alert("Hello world!");
}

DOM0级事件处理程序

DOM0级事件处理程序是在js中处理的,它的优势是简单,目前所有浏览器支持良好,并且不会与html代码产生耦合.

 var btn =  document.getElementById('btn');btn.onclick  = function(){alert('clicked me!');};

这里是把事件处理程序赋值给了DOM对象的属性,这个属性的构成是on+事件名,比如onclick`onblur`onload.

DOM2级事件处理程序

DOM2级事件定义了两个方法addEventListener removeEventListener,这两个方法都接收三个参数.第一个参数代表事件类型;第二个参数代表事件处理程序;第三个参数是指在冒泡阶段还是捕获阶段处理事件处理程序,如果为true代表捕获阶段处理,如果是false代表冒泡阶段处理.
IE9,google,Firefox兼容DOM2级事件处理程序.

    var btn = document.getElementById('btn');//事件处理程序function handler(){alert('click!');}//注册事件处理程序addEventListener('click',handler,false);//注销事件处理程序removeEventListener('click',handler,false);

注:添加匿名事件处理程序无法被注销

IE事件处理程序

IE8及以下浏览器不支持DOM2级事件处理程序,但也自己定义了attachEvent`detachEvent`两个方法,这两个方法只接受两个参数,因为IE8及以下版本不支持事件捕获,所以没有第三个参数.

var btn = document.getElementByID("btn");//事件处理程序function handler(){alert('click!');}//注册事件处理程序attachEvent('click',handler,false);//注销事件处理程序detachEvent('click',handler,false);

跨浏览器的事件处理程序

综合以上几种事件处理程序,我们封装出了一个跨浏览器的事件处理程序对象.

    var EventUtil ={//注册事件处理程序addEventHandler: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;}},//注销事件处理程序removeEventHandler: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;}}};var btn = document.getElementById('btn'),handler=function(event){alert(this.value);};EventUtil.addEventHandler(btn,'click',handler);

事件对象

在触发DOM的某个事件时,会产生一个事件对象,这个对象包含着所有与事件相关的信息。包括导致事件的元素,事件的类型,以及其他与特定事件相关的信息.例如鼠标操作导致的事件对象中,包含鼠标位置的信息,键盘定义的事件中包含按下键相关的信息.所有浏览器支持event对象,但支持方式不同.

DOM中的事件对象

兼容DOM的浏览器会将一个event对象传入到事件处理程序中.DOM0和DOM2都会传入event. html事件处理程序也有event对象.

 var btn = document.getElementById("btn");btn.onclick = function(event){alert(event.type);}btn.addEventHandler('click',function(event){alert(event.type);},false);

触发的事件类型不一样,可用的属性和方法也不一样.不过所有事件的event对象都有公共成员,这里列出几个常用的属性和方法.

  1. 属性
    currentTarget 指向某个元素,事件处理程序发生在此元素上
    target 事件的目标
    type 事件类型
    eventPhase 事件所处阶段

  2. 事件
    preventDefault() 取消事件的默认行为
    stopPropagation() 取消事件的进一步冒泡或捕获
    在事件处理程序内部,对象this始终等于currentTarget的值.而target则只包含事件的实际目标.

IE中的事件对象

使用DOM0级事件处理程序时,event对象作为window对象的一个属性存在;
使用attachEvent()事件处理程序时,event对象作为参数传入.

跨浏览器的事件对象

var EventUtil = {//添加事件addEventHandler: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;}},//移除事件removeEventHandler: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;}},//获取事件对象getEvent: function (event) {return event ? event : window.event;},//获取事件目标getTarget:function(event){return event.target || event.srcElement;},//阻止默认行为preventDefault:function(event){if(event.preventDefault){event.preventDefault();}else{event.returnValue = false;}},//阻止事件冒泡stopPropagation:function(event){if(event.stopPropagation){event.stopPropagation();}else{event.cancelBubble=true;}}
};

使用以上定义的EventUtil对象,可以在所有浏览器中进行进行事件的添加,移除,获取事件对象,获取事件目标,阻止事件冒泡,阻止事件默认行为.

Javascript之事件(一)相关推荐

  1. Javascript自定义事件功能与用法实例分析

    原文地址:https://www.jb51.net/article/127776.htm 本文实例讲述了javascript自定义事件功能与用法.分享给大家供大家参考,具体如下: 概述 自定义事件很难 ...

  2. Javascript知识——事件

    O(∩_∩)O~~又是新的一周开始了,今天还是在继续学习Javascript知识,今天主要讲了事件的知识.现在就总结下吧. 事件 事件一般是用于浏览器和用户操作进行交互.最早是 IE 和 Netsca ...

  3. javascript原生事件句柄、BOM、DOM对象属性方法总结

    javascript原生事件句柄.BOM.DOM对象属性方法总结 JS事件句柄 事件句柄 类型 说明 onabort 事件句柄 图像加载被中断 onblur 事件句柄 元素失去焦点 onfocus 事 ...

  4. html鼠标离开点击停留,Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)...

    本文实例总结了Javascript DOM事件操作.分享给大家供大家参考,具体如下: 使用JavaScript可以对HTML页面上的各种事件进行监听,如鼠标点击/释放,鼠标悬停/离开,等等. 效果图: ...

  5. JavaScript触发事件大全--能力工场

    1.onabort:当用户终止正在打开的网页时产生该事件. 2.onblur:某元素失去活动焦点时产生该事件.例如鼠标在文本框中点击后又在文本框外点击时就会产生. 3.onchange:当网页上某元素 ...

  6. JavaScript为事件处理器传递参数 (转)

    首先参考:javascript attachEvent和addEventListener 使用方法 attachEvent方法,为某一事件附加其它的处理事件.(不支持Mozilla系列) addEve ...

  7. JavaScript的事件执行机制及异步

    由于javascript是单线程的,只能在JS引擎的主线程上运行的,所以js代码只能一行一行的执行,不能在同一时间执行多个js代码任务,这就导致如果有一段耗时较长的计算,或者是一个ajax请求等IO操 ...

  8. JavaScript常用事件(1)

    1.JavaScript常用事件 1.onclick事件:接收鼠标对页面元素按下并松开的动作 2.onchange事件:输入框的值发生了变化或改变下拉列表框的选项时触发的事件 3.onload事件:页 ...

  9. js鼠标事件大全-Javascript鼠标事件大全

    js鼠标事件大全-Javascript鼠标事件大全 2009年03月11日 星期三 14:22 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击onDblClick 当键盘上的某个键被按下并且释放时 ...

  10. 原生JS javascript解除绑定事件 JS删除绑定事件

    原生JS javascript解除绑定事件 JS删除绑定事件 一.直接删除法 1.适用于直接绑定的事件,如: <h1 id="h1" onclick="_click ...

最新文章

  1. 利用CMake编译内核模块
  2. ASP.NET MVC Core的TagHelper (高级特性)
  3. Java中利用socket实现简单的服务端与客户端的通信(基础级)
  4. mysql中binlog_format模式与配置详解
  5. 微前端之qiankun
  6. Spring学习笔记(三)
  7. 心疼吗?被指是“傻X” 罗永浩深夜怒怼网友
  8. 写给我--过去,现在,未来
  9. leetcode 761. Special Binary String
  10. APL开发日志--2012-11-14
  11. OpenWrt network 启动过程
  12. Python文件(二):数据组织的维度,一维数据的表示、存储、处理
  13. 山科OJ:Problem C: Lemon
  14. MySQL创建S,P,J,SPJ表,以及SQL语句
  15. android手机用户,ZDC:2011年Android手机用户使用行为研究报告
  16. MFC下ODBC方式连接数据库
  17. 大学物理——电磁学的一些知识整理
  18. C++语法——详解运算符重载
  19. 含泪推荐三大(cc协议)2d素材网站
  20. trogan连接不上_appstore连接不上 三个解决方法【图文教程】

热门文章

  1. MFC菜鸟学编程——第一篇
  2. 3 ADO.NET跟踪日志
  3. 移动应用专项测试思路和方法
  4. 第一代计算机到第四代计算机基本知识,[Ch01_计算机系统基本知识.ppt
  5. iOS进阶之底层原理-cache_t
  6. ios 苹果审核常见被拒问题
  7. python编程15讲答案,[Python编程:从入门到实践] 第十五章:生成数据 习题答案
  8. 操作系统内存管理_操作系统6内存管理基础
  9. Oracle SID爆破工具SidGuess
  10. GRDB使用SQLite的WAL模式