一、事件绑定模型

DOM0事件模型

1.内联模型(行内绑定):将函数名直接作为HTML标签中事件属性的属性值

<button id="btn" onclick="func()">内联模型绑定</button>

缺点:不符合W3C中关于内容与行为分离的基本规范

2.脚本模型(动态绑定):通过在JS中选中某个节点,然后给节点添加onclick属性。

<button id="btn1">脚本模型绑定</button>
<script>
document.getElementById("btn1").onclick = function () {
alert("");
};
</script>

优点:符合W3C中关于内容与行为分离的基本规范,实现HTML与JS的分离。

3.DOM0共有缺点:

a.同一个节点只能添加一次同一事件,如果添加多次最后一个生效

b.通过DOM0绑定的事件,一旦绑定将无法取消(虽然行内绑定可以removeAttribute但不算)

DOM2事件模型

1.添加DOM2事件绑定:

①IE8之前,使用.attachEvent("onclick",func3);谷歌不支持这种写法

②IE8之后,使用.addEventListener("click",func3,true/false);

参数三:false(默认)表示事件冒泡;传入true 表示事件捕获;

③兼容所有浏览器的处理方式:

<button id="btn2">DOM2模型绑定</button>
<script>
var btn2 = document.getElementById("btn2");
if(btn2.attachEvent){
btn2.attachEvent("onclick",func3);
}else{
btn2.addEventListener("click",func3);
}
function func3(){
alert("");
}
</script>

2.DOM2绑定的优点

①同一个节点可以绑定多个同类事件

<script>
btn2.addEventListener("click",function(){
alert("第二次绑定click事件");
});
</script>

②使用DOM2绑定的事件可以有专门的函数进行事件取消

3.DOM2取消事件绑定:

①使用.attachEvent("onclick",func3);绑定,要用.detachEvent("onclick",func3);取消

②使用.addEventListener("click",func3);绑定,要用.removeEventListener("click",func3);取消

③兼容所欲浏览器的处理方式:

注意:如果DOM2绑定的事件,需要取消,则绑定事件时,回调函数必须是函数名,而不能是匿名函数。

因为取消事件时需要传入函数名进行取消

<button id="btn3">取消DOM2模型绑定</button>
<script>
var btn3 = document.getElementById("btn3");
btn3.onclick = function () {
if(btn2.detachEvent){
btn2.detachEvent("onclick",func3);
}else {
btn2.removeEventListener("click",func3);
}
alert("事件已取消!");
};
</script>

二、事件流模型

1.事件冒泡(false或默认):当触发一个节点的事件时,会从当前节点开始,依次触发其祖先节点的同类型事件,直到DOM根节点

2.事件捕获(true):当触发一个节点的事件时,会从DOM根节点开始,依次触发其祖先节点的同类型事件,直到当前节点自身。

        ↓ DOM根节点 ↑

          捕 冒

        ↓ 祖先节点 ↑

          获 泡

        ↓ 当前节点 ↑

3.什么时候事件冒泡,什么时候事件捕获?

①当使用addEventListener绑定事件,第三个参数传入true时表示事件捕获;

②除此之外全都是事件冒泡

<body>
  <div id="div1">1
   <div id="div2">2
   <div id="div3">3</div>
  </div>
  </div>
</body>
<script>
  var div1 = document.getElementById("div1");
  var div2 = document.getElementById("div2");
  var div3 = document.getElementById("div3");
  //事件冒泡
  div1.addEventListener("click",function () {
console.log("div1 click 1");
});
div2.addEventListener("click",function () {
//myParagraphEventHandler();
console.log("div2 click 2")
});
div3.addEventListener("click",function () {
console.log("div3 click 3");
}); //事件捕获
div1.addEventListener("click",function () {
console.log("div1 click 1");
},true);
div2.addEventListener("click",function () {
//myParagraphEventHandler();
console.log("div2 click 2")
},true);
div3.addEventListener("click",function () {
console.log("div3 click 3");
},true);
</script>

4.阻止事件冒泡:

①IE10之前(包含10),使用:e.cancelBubble = true;

②IE10之后,使用:event.stopPropagation();

  function myParagraphEventHandler(e) {
e = e || window.event;
if (e.stopPropagation) {
e.stopPropagation(); //IE10以后和其他浏览器
} else {
e.cancelBubble = true; //IE10以前(包含10)
}
}

5.阻止默认事件:

①IE10之前(包含10),使用:e.returnValue = false;

②IE10之后,使用:e.preventDefault();

<a href="01-事件笔记.html" onclick="func()">超链接</a>
<script>
function func(e) {
e = e || window.event;
eventHandler(e);
alert("您点击了超链接但是您走不了哈哈哈哈哈!!!");
}
//阻止默认事件的函数
function eventHandler(e) {
e = e || window.event;
// 防止默认行为
if (e.preventDefault) {
e.preventDefault(); //IE10以后和其他浏览器
} else {
e.returnValue = false; //IE10以前(包含10)
}
}
</script>

JavaScript常用的事件模型的更多相关文章

  1. 说说JavaScript中的事件模型

    1.javascript中为元素添加事件处理程序的方法有以下几种方式,可以为javascript元素添加事件处理程序 (1) 直接将事件处理代码写在html中(2) 定义一个函数,赋值给html元素的 ...

  2. 理解javascript中的事件模型

    javascript中有两种事件模型:DOM0,DOM2.而对于这两种的时间模型,我一直不是非常的清楚,现在通过网上查阅资料终于明白了一些. 一.  DOM0级事件模型 DOM0级事件模型是早期的事件 ...

  3. JavaScript中的事件模型

    JS中的事件 1.鼠标事件 onclick   ondbclick   onmouseover   onmouseout 2.HTML事件 onload   onunload   onsubmit   ...

  4. Javascript事件模型系列(一)事件及事件的三种模型

    一.开篇 在学习javascript之初,就在网上看过不少介绍javascript事件的文章,毕竟是js基础中的基础,文章零零散散有不少,但遗憾的是没有看到比较全面的系列文章.犹记得去年这个时候,参加 ...

  5. JavaScript DOM事件模型

    早期由于浏览器厂商对于浏览器市场的争夺,各家浏览器厂商对同一功能的JavaScript的实现都不进相同,本节内容介绍JavaScript的DOM事件模型及事件处理程序的分类. 1.DOM事件模型.DO ...

  6. javascript之BOM事件注册和案例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. java基础66 JavaScript中的事件、localtion对象、screen对象(网页知识)

    1.JavaScript中的事件注册 1.1.事件的注册方式 方式1:直接在html元素上注册 <body onLoad="ready()"></body > ...

  8. javascript中0级DOM和2级DOM事件模型浅析

    Javascript程序使用的是事件驱动的设计模式,为一个元素添加事件监听函数,当这个元素的相应事件被触发那么其添加的事件监听函数就被调用: <input type="button&q ...

  9. JavaScript事件模型及事件代理

    事件模型 JavaScript事件使得网页具备互动和交互性,我们应该对其深入了解以便开发工作,在各式各样的浏览器中,JavaScript事件模型主要分为3种:原始事件模型.DOM2事件模型.IE事件模 ...

随机推荐

  1. Leetcode_169_Majority Element

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42247887 Given an array of size ...

  2. Mahout 系列之----共轭梯度

    无预处理共轭梯度 要求解线性方程组 ,稳定双共轭梯度法从初始解 开始按以下步骤迭代: 任意选择向量 使得 ,例如, 对 若 足够精确则退出 预处理共轭梯度 预处理通常被用来加速迭代方法的收敛.要使用预 ...

  3. OC语言(四)

    二十八.id类型(万能指针) 可以指向任何id对象(本身就是指针,不用*) id相当于NSObject *,类似于一种多态. 二十九.重写构造方法 new方法的实质:分配空间+alloc 和 初始化- ...

  4. jsp中的tag与tld

    转载自: http://www.cnblogs.com/fanzi2009/archive/2010/04/08/1707888.html 在jsp文件中,可以引用tag和tld文件.  1.对于ta ...

  5. Android中处理大图片时图片压缩

    1.BitmapFactory.Options中的属性 在进行图片压缩时,是通过设置BitmapFactory.Options的一些值来改变图片的属性的,下面我们来看看BitmapFactory.Op ...

  6. PS图层混合算法之一(不透明度,正片叠底,颜色加深,颜色减淡)

    下列公式中,A代表了上面图层像素的色彩值(A=像素值/255),B代表下面图层像素的色彩值(B=像素值/255),C代表了混合像素的色彩值(真实的结果像素值应该为255*C).该公式也应用于层蒙板. ...

  7. ActiveX数据对象之事务控制在VB和DELPHI中的应用

            本文发表在中国人民解放军"信息工程大学"学报 2001年第3期.        ActiveX数据对象之事务控制在VB和DELPHI中的应用             ...

  8. 集群增量会话管理器——DeltaManager

    DeltaManager会话管理器是tomcat默认的集群会话管理器,它主要用于集群中各个节点之间会话状态的同步维护,由于相关内容涉及到集群,可能会需要一些集群通信相关知识,如果有疑问可结合集群相关章 ...

  9. Linux文件系统的简单操作 - df, du, ln

    现在我们知道磁盘的整体数据是在 superblock 区块中,但是每个各别文件的容量则在 inode 当中记载的. 那在文字接口底下该如何叫出这几个数据呢?底下就让我们来谈一谈这两个命令: df:列出 ...

  10. Globalization Guide for Oracle Applications Release 12

    Section 1: Overview Section 2: Installing Section 3: Configuring Section 4: Maintaining Section 5: U ...