在慕课网上学习了DOM事件探秘课程,特此整理了一下笔记。

  慕课网DOM事件探秘课程地址:http://www.imooc.com/learn/138

事件

  是文档或浏览器窗口中发生的特定的交互瞬间。【JavaScript <------>HTML】

事件流

  描述的是从页面中接受事件的顺序 (IE:事件冒泡流 / Netscape事件捕获流)

事件的三个阶段

  事件的三个阶段分别是:捕获阶段、目标阶段、冒泡阶段

  事件冒泡流:即事件最开始由最具体的无素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到最不具体的那个节点(文档) input----->document

  事件捕获:不太具体的节点应该更早接收到事件,而最具体的节点最后接收到事件。跟事件冒泡截然相反

  事件冒泡:从最内层至最外层(最常用)

  事件捕获:从最外层至最内层

事件处理程序

1.HTML事件处理程序(现在不建议使用了):事件直接加在HTML代码中

<input type="button" value="按钮" id="btn" onclick="alert('hellow')">

  <input type="button" value="按钮" id="btn" onclick="show()">

缺点:①HTML和js代码高耦合,如果修改,就要修改两个地方--HTML元素内和script函数。

     ②可能存在时差问题。考虑这样一种情形。show函数定义在按钮的后面,当DOM还没有加载到script标签的时候将会发生错误,此种情形可以通过内部添加try-catch来解决;或者将script标签放到页面顶部,但会延迟页面的加载速度。

2.DOM0级事件处理程序 (用得比较多)浏览器4代出现

  较传统的方式:把一个函数赋值给一个事件处理程序的属性。  

  优点:简单,跨浏览器  

  var btn=document.getElementById("btn2");---先获取出元素,定义对象 //取得btn按钮对象  

  btn.onclick=function(){alert('这是通过DOM0级添加的事件!')}----让 事件以对象的属性 的形式出现。 //给btn添加onclick属性 

  btn.onclick=null;-----删除onclick属性。

3.DOM2级事件处理程序

  定义了两个方法--用于处理指定和删除事件处理程序的操作:

  addEventListener()添加事件监听程序

  removeEventListener()移除事件监听程序

  三个参数设置;事件名称,处理方法(函数),布尔值--false:表示在冒泡阶段调用事件处理程序(可以最大限度的兼容浏览器),一般设为false;true表示在捕获阶段调用事件处理程序

  btn.addEventListener('click',showMes,false);  //showMes为方法名

  注意:

  ①、若事件名称有on,则需去掉on。onclick --> click,onmouseover --> mouseover等等;

  ②、false 最大限度兼容所有浏览器--事件冒泡流。

  ③、通过addEventListener添加的事件只能通过removeEventListener来删除。--参数要与添加事件时相同

  btn.removeEventListener(参数); //参数必须和btn.addEventListener的参数一致,删除事件监听

  DOM0级和DOM2级事件处理程序可以给一个事件绑定多个函数,事件触发的时候会按照绑定顺序执行各个函数。如下所示:

  btn.addEventListener('click',showMes,false);

  btn.addEventListener('click',showMes,function(){alert(this.value);},false);

  缺点:IE不支持该事件

  DOM2级删除事件不能直接使用匿名函数。

  btn3.addEventListener('click',function(){alert("this.value");},false); //添加事件有效

  btn3.removeEventListener('click',function(){alert("this.value");},false); //删除事件无效

  因为匿名函数看起来是一样的,其实是两个不同的对象。

  btn3.addEventListener('click',function(){alert("this.value");},false);

  btn3.removeEventListener('click',function(){alert("this.value");},false);

  这两行代码中的function(){alert(alert("this.value"));}看上去是同一个东西,实际上是不同的对象,而removeEventListener要求函数必须一样。

  所以addEventListener最好还是用将匿名函数赋值给某个变量

  addEventListener('click',showValue,false);

  removeEventListener('click',showValue,false);

  这样就不会出bug了。

  加括号——调用函数

  只要是要调用函数执行的,都必须加括号。此时,function()实际上等于函数的返回值。(没有返回值也已经执行了函数体内的行为)。就是说,只要加括号的,就代表将会执行函数体代码。  

  不加括号——指定函数引用  

  把函数名作为函数指针,用于传参,此时不是得到函数结果,因为不会运行函数体代码。它只是传递了函数体所在地址,在需要时找到函数体去执行。

4.IE事件处理程序:

  attachEvent()添加事件和detachEvennt()删除事件

  接收相同的两个参数:事件处理程序的名称和事件处理程序的函数,加on,没有布尔值;

  不加第三个参数的原因:IE8及更早的浏览器版本只支持事件冒泡

  btn.attachEvent('onclick',showMes);

  支持IE事件处理程序的浏览器:IE和OPERA

  btn.detachEvent('onclick',showMes);

事件对象event

  在触发DOM上的事件时都会产生一个对象。

  1、DOM中的事件对象

    ①、type属性,用于获取事件类型  event.type

    ②、target属性,用于获取事件目标  event.target

    ③、stopPropagation()方法,用于阻止事件冒泡

    ④、preventDefault()方法,阻止事件的默认行为,比如a标签的跳转

    如果一个div里面有一个button,button和div都绑定了click事件,如果是事件冒泡,那么点击button的时候,首先触发button的处理函数,然后触发div的处理函数。(由内而外)

    如果有时候不想冒泡,也就是不希望div的事件被触发,那么需要阻止事件冒泡。stopPropagation()方法

    如果需要阻止a标签的默认属性跳转,可以使用阻止事件的默认行为preventDefault()方法

  2、IE事件对象(window.event)

    ①、事件类型:event.type  type属性,用于获取事件类型

    ②、事件目标:event.srcElement  srcElement属性,用于获取事件的目标

    ③、阻止事件冒泡:event.cancelBubble = true  cancelBubble属性,用于阻止事件冒泡  设置为true表示阻止冒泡,设置为false表示不阻止冒泡

    ④、阻止默认事件:event.returnValue = false  returnValue属性,用于阻止事件的默认行为  设置为false表示阻止事件的默认行为

  事件处理程序执行完后,event对象将被销毁;在事件处理程序内部this === currentTarget,而target则表示的是事件的实际目标,

  事件委托就是事件目标自身不处理事件,而是把处理任务委托给其父元素或者祖先元素,甚至根元素(document)。因为子节点触发事件的时候,会冒泡到父节点,触发该事件,这样就可以避免新加节点就绑定事件

跨浏览器处理程序封装

/*
* [eventUtil 事件处理程序]
*/
var eventUtil={
//添加事件
addEvent:function(element,type,handler){
if(element.addEventListener){
element.addEventListener(type,handler,false); //DOM2级
}else if(element.attachEvent){
element.attachEvent('on'+type,handler); //IE处理程序
}else{
element['on'+type]=handler; //DOM0级 element.onclick === element['onclick']
}
},
//删除事件
removeEvent: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;
},
//获取事件类型
getEventType:function(event){
return event.type;
},
//获取事件对象
getEventTarget: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;
}
},
}

 

 

DOM事件的更多相关文章

  1. DOM 事件深入浅出(二)

    在DOM事件深入浅出(一)中,我主要给大家讲解了不同DOM级别下的事件处理程序,同时介绍了事件冒泡和捕获的触发原理和方法.本文将继续介绍DOM事件中的知识点,主要侧重于DOM事件中Event对象的属性 ...

  2. DOM 事件深入浅出(一)

    在项目开发时,我们时常需要考虑用户在使用产品时产生的各种各样的交互事件,比如鼠标点击事件.敲击键盘事件等.这样的事件行为都是前端DOM事件的组成部分,不同的DOM事件会有不同的触发条件和触发效果.本文 ...

  3. 理解DOM事件流的三个阶段

    本文主要解决两个问题: 1.什么是事件流 2.DOM事件流的三个阶段 事件流之事件冒泡与事件捕获 在浏览器发展的过程中,开发团队遇到了一个问题.那就是页面中的哪一部分拥有特定的事件? 可以想象画在一张 ...

  4. 你真的了解DOM事件么?

    你真的了解DOM事件么? 我们大家都知道,人与人之间的交流可以通过语言,文字,肢体动作,面部微表情等,但是你知道Javascript和HTML之间是通过什么进行交互的么?你又知道Javascript和 ...

  5. [DOM Event Learning] Section 4 事件分发和DOM事件流

    [DOM Event Learning] Section 4 事件分发和DOM事件流 事件分发机制: event dispatch mechanism. 事件流(event flow)描述了事件对象在 ...

  6. dom事件与event对象总结

    1 事件:就是文档或浏览器窗口中发生的一些特定的交互瞬间.    tips:js和xhtml的交互是通过当用户或浏览器操作网页时发生的事件来处理的. 1.1 事件流:即事件的顺序.        事件 ...

  7. DOM事件简介--摘自admin10000

    Click.touch.load.drag.change.input.error.risize — 这些都是冗长的DOM(文档对象模型)事件列表的一部分.事件可以在文档(Document)结构的任何部 ...

  8. 从click事件理解DOM事件流

    事件流是用来解释页面上的不同元素接受一个事件的顺序,首先要明确两点: 1.一个事件的影响元素可能不止一个(同心圆理论),但目标元素只有一个. 2.如果这些元素都绑定了相同名称的事件函数,我们怎么知道这 ...

  9. DOM事件机制进一步理解

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

随机推荐

  1. Javascript操作DOM常用API总结

    基本概念 在讲解操作DOM的api之前,首先我们来复习一下一些基本概念,这些概念是掌握api的关键,必须理解它们. Node类型 DOM1级定义了一个Node接口,该接口由DOM中所有节点类型实现.这 ...

  2. 虚函数的使用 以及虚函数与重载的关系, 空虚函数的作用,纯虚函数->抽象类,基类虚析构函数使释放对象更彻底

    为了访问公有派生类的特定成员,可以通过讲基类指针显示转换为派生类指针. 也可以将基类的非静态成员函数定义为虚函数(在函数前加上virtual) #include<iostream> usi ...

  3. linux磁盘空间查询

    LINUX服务器查询 1. du -sch *   使用该命令查询当前目录下文件夹占用的空间的情况 2. df -hl  查询磁盘剩余空间 3. root权限  fdisk -l

  4. Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

    Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...

  5. JavaScript 日期选择器 Pikaday

    找一些插件的过程实在太痛苦了...好容易找到一个,赶紧记录下.免得以后重复浪费时间在这上面. 插件名:Pikaday github地址:https://github.com/dbushell/Pika ...

  6. bzoj3744 Gty的妹子序列

    我是萌萌的传送门 感觉这题还是不错的--虽然其实算是比较水的题= = 首先分块,令f[i][j]表示第i块到第j块的逆序对数,询问的时候直接计算不完整块与完整块以及不完整块之间的逆序对. 不完整块之间 ...

  7. grep

    http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856896.html

  8. nginx负载SignalR

    前几天写了篇聊天室服务器扩展随想,今天有空开始实施第一步, 聊天服务器用SignalR self-host,负载用nginx,当然这只是测试,实际使用可能还需要修改. 第一步,搭好SignalR服务, ...

  9. 实现放大转场动画 from cocoachina

    原文1:http://www.cocoachina.com/ios/20160318/15714.html 原文2:http://ningandjiao.iteye.com/blog/2049105 ...

  10. 内存动态分配之realloc(),malloc(),calloc()与new运算符

    1,malloc与free是C/C++的标准库函数,new/delete是C++的运算符,是C++面向对象的特征,它们都可用于申请动态内存和释放内存.2,对于非内部数据类型的对象而言,光用maloc/ ...