JavaScript常用的事件模型
一、事件绑定模型
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常用的事件模型的更多相关文章
- 说说JavaScript中的事件模型
1.javascript中为元素添加事件处理程序的方法有以下几种方式,可以为javascript元素添加事件处理程序 (1) 直接将事件处理代码写在html中(2) 定义一个函数,赋值给html元素的 ...
- 理解javascript中的事件模型
javascript中有两种事件模型:DOM0,DOM2.而对于这两种的时间模型,我一直不是非常的清楚,现在通过网上查阅资料终于明白了一些. 一. DOM0级事件模型 DOM0级事件模型是早期的事件 ...
- JavaScript中的事件模型
JS中的事件 1.鼠标事件 onclick ondbclick onmouseover onmouseout 2.HTML事件 onload onunload onsubmit ...
- Javascript事件模型系列(一)事件及事件的三种模型
一.开篇 在学习javascript之初,就在网上看过不少介绍javascript事件的文章,毕竟是js基础中的基础,文章零零散散有不少,但遗憾的是没有看到比较全面的系列文章.犹记得去年这个时候,参加 ...
- JavaScript DOM事件模型
早期由于浏览器厂商对于浏览器市场的争夺,各家浏览器厂商对同一功能的JavaScript的实现都不进相同,本节内容介绍JavaScript的DOM事件模型及事件处理程序的分类. 1.DOM事件模型.DO ...
- javascript之BOM事件注册和案例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- java基础66 JavaScript中的事件、localtion对象、screen对象(网页知识)
1.JavaScript中的事件注册 1.1.事件的注册方式 方式1:直接在html元素上注册 <body onLoad="ready()"></body > ...
- javascript中0级DOM和2级DOM事件模型浅析
Javascript程序使用的是事件驱动的设计模式,为一个元素添加事件监听函数,当这个元素的相应事件被触发那么其添加的事件监听函数就被调用: <input type="button&q ...
- JavaScript事件模型及事件代理
事件模型 JavaScript事件使得网页具备互动和交互性,我们应该对其深入了解以便开发工作,在各式各样的浏览器中,JavaScript事件模型主要分为3种:原始事件模型.DOM2事件模型.IE事件模 ...
随机推荐
- 通过iframe引入另外一个项目中的html片段到项目中,解决样式,高度,兼容等问题的策略
<!--尾部开始--> <iframe src="http://172.16.24.11:9000/cartoon-web/footer_new" m ...
- 【翻译】Ext JS——高效的编码风格指南
原文:ExtJS - Efficient coding style guide 作者:Raja 切勿使用"new"关键字:在Ext JS中,使用"new"关键字 ...
- 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...
- Xcode中的调试工具栏简介
如下图所示: 从左至右,第一个按钮用来隐藏调试区域. 第二个按钮向你展示断点是否被全局开启或禁用.如果它不是高亮蓝色,则没有断点会被触发. 第三个按钮暂停或继续程序的执行,你一般点击它继续运行到程序的 ...
- MPlayer 使用手册中文版
播放文件 使用 MPlayer 播放媒体文件最简单的方式是: mplayer <somefile> MPlayer 会自动检测文件的类型并加以播放,如果是音频文件,则会在命令行中显示该播放 ...
- XWork容器的存储结构
我们可以看到,在Container的默认实现,ContainerImpl中有两个实例变量.factoris和factoryNamesByType. 对象制造工厂 class ContainerImpl ...
- LeetCode之“树”:Binary Tree Preorder && Inorder && Postorder Traversal
Binary Tree Preorder Traversal 题目链接 题目要求: Given a binary tree, return the preorder traversal of its ...
- Android开发技巧——自定义单选或多选的ListView
这篇其实应该是属于写自定义单选或多选的ListView的基础教程,无奈目前许多人对此的实现大多都绕了远路,反而使得这正规的写法倒显得有些技巧性了. 本文原创,转载请注明在CSDN上的出处: http: ...
- Linux Framebuffer驱动剖析之一—软件需求
嵌入式企鹅圈将以本文作为2015年的终结篇,以回应第一篇<Linux字符设备驱动剖析>.嵌入式企鹅圈一直专注于嵌入式Linux和物联网IOT两方面的原创技术分享,稍后会发布嵌入式企鹅圈的2 ...
- android decorView详解
摘要 一.DecorView为整个Window界面的最顶层View. 二.DecorView只有一个子元素为LinearLayout.代表整个Window界面,包含通知栏,标题栏,内容显示栏三块区域. ...