DOM事件代码小结
以下代码出自《DOM Enlightenment》一书
1.三种事件形式
<body onclick="alert('触发内联属性事件')">
<div>click me</div>
</body>
<script>
var div = document.querySelector('div');
div.onclick = function() {
alert("触发属性事件");
};
div.addEventListener('click', function() {
alert('触发addEventListener');
}, false);
</script>
2.事件流程
先捕获后冒泡
捕获:从树主干到分支
冒泡:从树分支到主干
<html>
<body>
<div>click me to start event flow</div>
</body>
</html>
<script>
// 捕获阶段 window
window.addEventListener('click', function() {
alert(1);
}, true); // 捕获阶段 document
document.addEventListener('click', function() {
alert(2);
}, true); // 捕获阶段 html
document.documentElement.addEventListener('click', function() {
alert(3);
}, true); // 捕获阶段 body
document.body.addEventListener('click', function() {
alert(4);
}, true); // 捕获阶段 div
document.querySelector('div').addEventListener('click', function() {
alert(5);
}, true); // 冒泡阶段 div
document.querySelector('div').addEventListener('click', function() {
alert(6);
}, false); // 冒泡阶段 body
document.body.addEventListener('click', function() {
alert(7);
}, false); // 冒泡阶段 html
document.documentElement.addEventListener('click', function() {
alert(8);
}, false); // 冒泡阶段 document
document.addEventListener('click', function() {
alert(9);
}, false); // 冒泡阶段 window
window.addEventListener('click', function() {
alert(10);
}, false); </script>
3.移除事件
<body>
<div>click to say hi</div>
</body>
<script>
var sayHi = function() {
alert('hi');
};
document.querySelector('div').addEventListener('click', sayHi, false); document.querySelector('div').removeEventListener('click', sayHi); document.body.addEventListener('click', function() {
alert('hello');
}, false); // 不是同一个回调,是不起作用的
document.body.removeEventListener('click', function() {
alert('hello');
});
</script>
4.事件状态对象
<body>
<div>click me</div>
</body>
<script>
document.querySelector('div').addEventListener('click', function(event) {
console.dir(event);
}, false); window.addEventListener('load', function(event) {
console.dir(event);
}, false);
</script>
5.监听函数this指向
this指向绑定事件的节点,即event.currentTarget属性
<body>
<div>click me</div>
</body>
<script>
document.body.addEventListener('click', function(event) {
alert(this);
alert(this == event.currentTarget)
});
</script>
6.获取事件触发元素(事件源头)
<body>
<div>click me</div>
</body>
<script>
document.body.addEventListener('click', function(event) {
alert(event.target);
});
</script>
7.阻止默认事件
<body>
<a href="http://www.baid.com">链接</a>
<input type="checkbox"/>
<textarea></textarea>
</body>
<script> // 点击链接时,阻止跳转
document.querySelector('a').addEventListener('click', function(e) {
e.preventDefault();
}); // 点击复选框时,阻止选中
document.querySelector('input').addEventListener('click', function(e) {
e.preventDefault();
}); // 在文本框中尝试输入字符时,阻止输入(使用输入法时,不一定会触发keypress事件)
document.querySelector('textarea').addEventListener('keypress', function(event) {
event.preventDefault();
});
</script>
8.阻止事件冒泡
<body>
<div>click</div>
</body>
<script>
document.querySelector('div').addEventListener('click', function(e) {
alert('div');
e.stopPropagation();
});
document.body.addEventListener('click', function() {
alert('body');
});
</script>
9.阻止冒泡和其他相同事件监听器
<body>
<div>click</div>
</body>
<script>
document.querySelector('div').addEventListener('click', function(e) {
alert(1);
});
document.querySelector('div').addEventListener('click', function(e) {
alert(2);
e.stopImmediatePropagation();
});
document.querySelector('div').addEventListener('click', function(e) {
alert(3);
});
document.body.addEventListener('click', function() {
alert('body');
});
</script>
10.自定义事件
<body>
<div>click</div>
</body>
<script>
var customEvent = document.createEvent('CustomEvent');
// 参数是:name,bubble,cancelable,detail
customEvent.initCustomEvent('hello', true, false,{
msg: 'hello'
});
var div = document.querySelector('div');
div.addEventListener('click', function() {
alert('click');
this.dispatchEvent(customEvent);
})
div.addEventListener('hello', function(e) {
alert(e.detail.msg);
})
</script>
11.模拟鼠标点击事件
<body>
<div>自动触发</div>
</body>
<script>
var div = document.querySelector('div');
div.addEventListener('click', function() {
alert('click');
}) var autoClick = document.createEvent('MouseEvent');
// 参数是: name,bubble,cancelable,view,detail,screenx,screeny,clientx,clienty,ctrlkey,altkey,shiftkey,metakey,button,relatedTarget
autoClick.initMouseEvent('click', true, true, document.defaultView,0,0,0,0,0,false,false,false,0,null,null);
div.dispatchEvent(autoClick);
</script>
12.事件委托
<p>点击某个单元格</p>
<table border="1">
<tr>
<td>row 1 col 1</td>
<td>row 1 col 2</td>
</tr>
<tr>
<td>row 2 col 1</td>
<td>row 2 col 2</td>
</tr>
<tr>
<td>row 3 col 1</td>
<td>row 3 col 2</td>
</tr>
<tr>
<td>row 4 col 1</td>
<td>row 4 col 2</td>
</tr>
</table>
<script>
document.querySelector('table').addEventListener('click', function(event) {
if (event.target.tagName.toLowerCase() == 'td') {
alert(event.target.textContent);
}
});
DOM事件代码小结的更多相关文章
- DOM 事件深入浅出(二)
在DOM事件深入浅出(一)中,我主要给大家讲解了不同DOM级别下的事件处理程序,同时介绍了事件冒泡和捕获的触发原理和方法.本文将继续介绍DOM事件中的知识点,主要侧重于DOM事件中Event对象的属性 ...
- DOM 事件深入浅出(一)
在项目开发时,我们时常需要考虑用户在使用产品时产生的各种各样的交互事件,比如鼠标点击事件.敲击键盘事件等.这样的事件行为都是前端DOM事件的组成部分,不同的DOM事件会有不同的触发条件和触发效果.本文 ...
- DOM事件
在慕课网上学习了DOM事件探秘课程,特此整理了一下笔记. 慕课网DOM事件探秘课程地址:http://www.imooc.com/learn/138 事件 是文档或浏览器窗口中发生的特定的交互瞬间.[ ...
- 理解DOM事件流的三个阶段
本文主要解决两个问题: 1.什么是事件流 2.DOM事件流的三个阶段 事件流之事件冒泡与事件捕获 在浏览器发展的过程中,开发团队遇到了一个问题.那就是页面中的哪一部分拥有特定的事件? 可以想象画在一张 ...
- 你真的了解DOM事件么?
你真的了解DOM事件么? 我们大家都知道,人与人之间的交流可以通过语言,文字,肢体动作,面部微表情等,但是你知道Javascript和HTML之间是通过什么进行交互的么?你又知道Javascript和 ...
- DOM事件简介--摘自admin10000
Click.touch.load.drag.change.input.error.risize — 这些都是冗长的DOM(文档对象模型)事件列表的一部分.事件可以在文档(Document)结构的任何部 ...
- DOM事件机制进一步理解
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- 【前端盲点】DOM事件流论证CSS盒模型是否具有厚度
前言 很久没有扯淡了,我们今天来扯淡吧. 我今天思考了一个问题,我们页面的dom树到底是如何渲染的,而CSS盒模型与javascript是否有联系,于是便想到一个问题: CSS的盒模型具有厚度么??? ...
- HTML DOM 事件
HTML DOM 事件 HTML DOM 事件 HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序. 事件通常与函数结合使用,函数不会在事件发生前被执行! (如用户 ...
随机推荐
- [python标准库]Pickle模块
Pickle-------python对象序列化 本文主要阐述以下几点: 1.pickle模块简介 2.pickle模块提供的方法 3.注意事项 4.实例解析 1.pickle模块简介 The pic ...
- Centos 执行shell命令返回127错误
shell脚本功能:连接mysql,自动创建数据库,脚本如下 mysql -h$MYSQL_IP -u$MYSQL_USER -p$MYSQL_PASSWORD --default-character ...
- 深入理解循环队列----循环数组实现ArrayDeque
我们知道队列这种数据结构的物理实现方式主要还是两种,一种是链队列(自定义节点类),另一种则是使用数组实现,两者各有优势.此处我们将要介绍的循环队列其实是队列的一种具体实现,由于一般的数组实现的队列结构 ...
- 华为A199:近期不会再买华为的手机了
为了支持国货,也省点钱,买了个华为A199: 缺点: 没有google play market很复杂的刷机后才能装Gmail 不过也有亮点: 自带录音功能,老htc通过软件也只能录单方向的哦关机闹 ...
- Datatable插件的简单的使用方式 和 学习方式
gridyxz = $("#sjjg_table_yxz").DataTable({ "searching" : false, "info&quo ...
- DllImport 自动选择x64或x86 dll
前言 标题不知道怎么确切地命名,在.net的托管世界里,有时不得不使用c的某个动态库,比如ocr.opencv等,如果幸运,有前人已经包装出.net版本,但有些不非常流行的库,只能自己使用pinvok ...
- 进程控制fork与vfork
1. 进程标识符 在前面进程描述一章节里已经介绍过进程的两个基本标识符pid和ppid,现在将详细介绍进程的其他标识符. 每个进程都有非负的整形表示唯一的进程ID.一个进程终止后,其进程ID就可以再次 ...
- Hibernate.cfg.xml 主配置
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hiber ...
- 关于通用的C#后台获取前台页面的标签的正则表达式
Regex reg = new Regex("<div[^>]*?class=\"类属性名称\"[^>]*>(.*?) </div> ...
- js替换字符串中所有指定的字符
第一次发现JavaScript中replace() 方法如果直接用str.replace("-","!") 只会替换第一个匹配的字符. 而str.replac ...