[JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播
-->事件冒泡和捕获
-->事件监听
-->阻止事件传播
一、事件冒泡和捕获
1、概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的onclick事件也会被触发。js里称这种事件连续发生的机制为事件冒泡或者事件捕获。
IE浏览器:事件从里向外发生,事件从最精确对象(target)开始触发,然后到最不精确的对象(document)触发,即事件冒泡
Netscape:事件从外向里发生,事件从最不精确的对象(document)开始触发,然后到最精确对象(target)触发,
即事件捕获
2、W3C标准将两者进行中和,在任何的W3C的事件模型中,
事件先进入捕获阶段,再进入冒泡阶段
3、一般的绑定事件方式
div1.onclick=function () {
alert('div被点击');
};
在一个支持W3C DOM的浏览器中,一般的绑定事件方式,采用的是事件冒泡方式
程序员可以选择绑定事件时采用事件捕获还是事件冒泡,
办法就是绑定事件时通过addEventListener( )方法
二、事件监听
1、支持W3C标准的浏览器在绑定事件时可以用addEventListener(type,fn,useCapture) 方法
参数:type----------事件类型,例:click
fn--------------事件处理函数
useCapture----布尔值true或false
( true表示事件捕获,false表示事件冒泡 )
为了兼容浏览器,第三个参数一般设置为false
事件监听:addEventListener(type,fn,useCapture)
事件移除:removeEventListener(type, fn, useCapture)
2、因为IE678只支持事件冒泡,不支持事件捕获,所以它也不支持addEventListener( )方法,IE提供了另一个函数:
attachEvent( type , fn )
参数:type---------事件类型,例:onclick
fn-------------事件处理函数
没有第三个参数
事件监听:attachEvent( type , fn )
事件移除:detachEvent( type , fn )
三、阻止事件传播
事件冒泡或事件捕获都有传播的特征
阻止事件传播的方法:
在W3C中使用 Event.stopPropagation();
在IE中使用 Event.cancelBubble=true;
var Event=ev||window.event;
if (Event.stopPropagation){
Event.stopPropagation();//非IE阻止事件传播
}else{
Event.cancelBubble=true;//IE阻止事件冒泡
}
四、阻止默认事件
var Event=ev||event;
if (Event.preventDefault) {
Event.preventDefault(); //非IE阻止默认事件
} else{
Event.returnValue=false; //IE阻止默认事件
};
return false; 代码中遇到立即停止执行,跳出正在执行的函数,相当于终止符,可以用来阻止默认事件
PS:注意使用位置,不能滥用
五、代码
组织事件传播示例:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>阻止事件传播</title>
- <style>
- *{margin:0;padding:0;list-style: none;}
- ul{width:500px;height:300px;background: #ccc;}
- li{width:300px;height:150px;background: pink;}
- p{width:100px;height:100px;background:blue;}
- </style>
- </head>
- <body>
- <ul>
- <li>
- <p></p>
- </li>
- </ul>
- <script>
- var ul=document.getElementsByTagName('ul')[0];
- var li=document.getElementsByTagName('li')[0];
- var p=document.getElementsByTagName('p')[0];
- ul.onclick=function(){
- alert('我是ul');
- }
- li.onclick=function(ev){
- alert('我是li');
- var e=window.event||ev;
- if (e.stopPropagation) {//组织事件传播到父级
- e.stopPropagation();
- //非IE阻止事件传播(W3C)
- } else {
- e.cancelBubble=true;
- //IE阻止事件传播(IE)
- }
- }
- p.onclick=function(){
- alert('我是p');
- }
- </script>
- </body>
- </html>
自定义右击菜单练习:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title></title>
- <style>
- *{margin:0;padding:0;}
- div{width:150px;height:300px;background: pink;display:none;position: absolute;}
- span{color:red;}
- </style>
- </head>
- <body>
- <div>
- <span>第一页</span>
- <span>下一页</span>
- <span>刷新</span>
- </div>
- <script>
- var div=document.getElementsByTagName('div')[0];
- document.oncontextmenu=function(ev){//菜单右击事件
- div.style.display='block';
- var e=window.event||ev;
- if(e.preventDefault){//组织默认右击事件
- e.preventDefault();
- }else{
- e.returnValue=false;
- }
- var winH=document.documentElement.clientHeight;
- var winW=document.documentElement.clientWidth;
- var divH=div.offsetHeight;
- var divW=div.offsetWidth;
- var x=e.clientX;
- var y=e.clientY;
- if (winH-y<divH) {
- div.style.top=(y-divH)+'px';
- } else {
- div.style.top=y+'px';
- }
- if (winW-x<divW) {
- div.style.left=(x-divW)+'px';
- } else {
- div.style.left=x+'px';
- }
- }
- </script>
- </body>
- </html>
[JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播的更多相关文章
- JavaScript 详说事件机制之冒泡、捕获、传播、委托
DOM事件流(event flow )存在三个阶段:事件捕获阶段.处于目标阶段.事件冒泡阶段. 事件捕获(event capturing):通俗的理解就是,当鼠标点击或者触发dom事件时,浏览器会 ...
- JS 中的事件绑定、事件监听、事件委托
事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...
- JS 事件绑定、事件监听、事件委托详细介绍
原:http://www.jb51.net/article/93752.htm 在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代 ...
- JS 中的事件绑定、事件监听、事件委托是什么?
在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代理)等.这些名词是什么意思呢,有什么作用呢? 事件绑定 要想让 JavaScri ...
- 原 JS监听回车事件
原 JS监听回车事件 发表于2年前(2014-06-04 10:16) 阅读(6101) | 评论(0) 11人收藏此文章, 我要收藏 赞0 1月16日厦门 OSC 源创会火热报名中,奖品多多哦 ...
- 两种js监听滚轮事件的方式
前段时间在写前端的时候,需要监听浏览器的滚轮事件 网上查了一下,找到两种监听滚轮事件的方法: 一.原生js通过window.onscroll监听 //window.onscroll = functio ...
- 使用 JS 关闭警告框及监听自定义事件(amaze ui)
使用 JS 关闭警告框及监听自定义事件(amaze ui) 一.总结 1.jquery匿名函数:第8行,jquery匿名函数,$(function(){});,有没有很简单,只是少了jquery的前面 ...
- H5_0003:JS禁用调试,禁用右键,监听F12事件的方法
1,禁用调试 // 这个方法是防止恶意调试的 (function () { console["log"]("=============================== ...
- js 监听后退事件及跳转页面
//直接跳转 window.location.href="b.html"; //返回上一级页面 window.history.back(-1); //返回下一级页面 window. ...
随机推荐
- ExecuteReader在执行有输出参数的存储过程时拿不到输出参数
异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 后期会在博客首发更新:http://dnt.dkill.net/Article/D ...
- 深入学习jQuery事件绑定
× 目录 [1]bind [2]trigger [3]delegate[4]on[5]one 前面的话 javascript有HTML.DOM0级.DOM2级和IE这四种事件处理程序,而jQuery对 ...
- 深入理解DOM事件类型系列第三篇——变动事件
× 目录 [1]删除节点 [2]插入节点 [3]特性节点[4]文本节点 前面的话 变动(mutation)事件能在DOM中的某一部分发生变化时给出提示,这类事件非常有用,但都只能使用DOM2级事件处理 ...
- 重置EntityFramework数据迁移到洁净状态
前言 翻译一篇有关EF数据迁移的文章,以备日后所用,文章若有翻译不当的地方请指出,将就点看,废话少说,看话题.[注意]:文章非一字一句的翻译,就重要的问题进行解释并解决. 话题引入 无法确定这种场景是 ...
- Vim 快速上手
1.vi的基本概念 基本上vi可以分为三种状态,分别是 命令模式(command mode) 插入模式(Insert mode) 底行模式(last line mode) 1) 命令行模式comman ...
- easyui-datagrid 列单击事件
首先要注意的就是,先添加一个js方法,名字可以自定义,但是必须得与下面的option里面的onClickRow:后面的一致即可 <script type="text/java ...
- javascript中异步和闭包产生的困惑
这里我不打算大谈特谈什么是异步,什么是闭包,这些内容在博客园都已经写的够多的了,但是这些内容出现的多,并不代表所有初学者都已经撑握了,所以我还是打算,用一个比较常见的示例来分析一下,或许能让对这个问题 ...
- IDDD 实现领域驱动设计-CQRS(命令查询职责分离)和 EDA(事件驱动架构)
上一篇:<IDDD 实现领域驱动设计-SOA.REST 和六边形架构> 阅读目录: CQRS-命令查询职责分离 EDA-事件驱动架构 Domin Event-领域事件 Long-Runni ...
- 相克军_Oracle体系_随堂笔记007-PGA
实际工作中,Oracle中有两个很重要:Server Process 和 PGA. PGA内存作用和构成 1.PGA作用 2.PGA构成 1)private SQL area 2)Sess ...
- 使用 gpg 加密文件 - 通过 shell 或 php
使用 gpg 加密文件 - 通过 shell 或 php 背景:客户提供私钥,并要求我方通过php把加密后的文件传输给他们. 环境 macOS Sierra 10.12.1 php 7.0.8 0.安 ...