Javascript事件传播(冒泡机制) (摘自 博客园 萍水相逢)

今天在使用javascript弹出菜单时遇到了问题,搞了一晌终于算有点眉目了.和大家一起分享下.有什么不对的地方希望大家多多留言评论.

定义:JavaSciprt事件中有两个很重要的特性:事件冒泡 以及目标元素 。

事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层。

目标元素: 任何一个事件的目标元素都是最开始的那个元素,并且它在我们的元素对象中以属性的形式出现。使用事件代理的话我们可以把事件处理器添加到一个元素上,等待一个事件从它的子级元素里冒泡上来,并且可以很方便地得知这个事件是从哪个元素开始的。

我的目的很简单,做一个类型window桌面的web页面.当单击开始菜单时弹出一个层,当单击桌面其他地方时隐藏开始菜单.以前对js的冒泡机制有点了解,知道window.event.cancelBubble 来设置是否启用事件传播.但是这只能在IE是使用.如果跨浏览器就不太合适了.Jquery中的event.stopPropagation()解决了浏览器的兼容性.以下举例说明:

<html xmlns="http://www.w3.org/1999/xhtml"
<head> 
    <title>jQuery - Start Animation</title> 
    <script type="text/javascript" src="Scripts/jquery-1.4.1-vsdoc.js"></script> 
    <script type="text/javascript"> 
        $(function () { 
            $("div").css({ border: "1px solid red" }); 
            $("#div1").css({ height: "500px", width: "500px" }).bind("click", function (event) { alert("div1"); return false;}); 
            $("#div2").css({ height: "300px", width: "300px" }).bind("click", function (event) { event.stopPropagation(); alert("div2"); }); 
            $("#div3").css({ height: "100px", width: "100px" }).bind("click", function (event) { alert("div3");  }); 
            $(document).bind("click", function (event) { alert("document"); }); 
        }); 
    </script> 
</head> 
<body> 
    <div id="div1"> 
        <div id="div2"> 
            <div id="div3"> 
            </div> 
        </div> 
    </div> 
</body> 
</html>

正常情况下,我们单击div3会显示"div3”—>"div2”—>"div1”—>"document”.但是我们在div2上加上event.stopPropagation()后,单击div3显示顺序为"div3”—>"div2”, 当单击div3时首先会触发div3的click事件,然后根据dom模型传播到div3的父节点也就是div2,然后执行div2的click事件,由于在div2的click事件中加入了event.stopPropagation(),取消事件传播,也就是说事件不再向上传播.

再来看div1,正常情况下单击div1会显示"div1”—>"document”.在div1中加入return false,通过返回false来取消默认的行为并阻止事件起泡。单击后只显示"div1".

原文地址:http://www.cnblogs.com/wuhen/

时间: 2024-10-24 09:44:00

Javascript事件传播(冒泡机制) (摘自 博客园 萍水相逢)的相关文章

Hibernate和Mybatis的区别(摘自博客园-----alicejiyayun)

目录(?)[-] 第一章     Hibernate与MyBatis 1 Hibernate 简介 2 MyBatis简介 第二章 开发对比 开发速度 开发社区 开发工作量 第三章 系统调优对比 Hibernate的调优方案 Mybatis调优方案 SQL优化方面 扩展性方面 第四章 对象管理与抓取策略 对象管理 抓取策略 第五章 缓存机制对比 Hibernate缓存 MyBatis缓存 相同点 不同点 两者比较 第六章 Hibernate与Mybatis对比总结 两者相同点 Mybatis优势

Javascript函数的简单学习 - &lt;转&gt; 博客园

Javascript函数的简单学习 函数的定义与调用1:函数的定义    语法格式    function 函数名(数据类型 参数1){//function是定义函数的关键字        方法体;//statements,用于实现函数功能的语句        [返回值return expression]//expression可选参数,用于返回函数值            }    //1:函数名:区分大小写,并且在同一个页面中,函数名是唯一的    //2:parameter:可选参数,用于

JavaScript的基本用法--博客园老牛大讲堂

我最近总结了关于javaScript的用法,下面分享给大家--关注博客园老牛大讲堂 数组的用法: var arr=[10,1,66,55,100,5,2,7,1]; var arr1=[4,8,11]; console.log(arr.push(4,8,11));//添加末尾元素,返回数组的长度 console.log("末尾添加元素:"+arr); console.log(arr.unshift(4,8,11));//添加头元素,返回数组长度 console.log("开头

Javascript之原型(二) - Zhouqin的博客

#Javascript之原型(二)许多oo语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所示,由于函数没有签名,在ECMAScript中无法实现接口继承.而ECMAScript中只支持实现继承,而且实现继承主要是依靠原型链来实现的. ###原型链 以上定义了两个类型:SuperType和SubType.每个类型分别有一个属性和方法.SubType继承了SuperType,而继承是通过创建SuperType的实例,并将该实例赋给SubTyoe.

使用JavaScript代码为博客园个人博客页面自动添置目录

当我们在博客中写的东西比较多,或者文章层次比较明显,有很多层次结构,这时如果没有目录导航,将特别难以阅读.博客园有着非常个性化的个人定制功能,可以通过添加js代码实现这个功能,由于对jquery不熟,因此采用原生js来做的.考虑到一般使用二级目录就够了,因此代码只实现到二级目录.也可以很方便的更改代码,实现更多级别. 另外,当页面滚动到后面时,再返回目录区域也很累,因此在右下加添加了一个返回目录的按钮,随着页面往下滚动,按钮出现并固定. 以下贴上代码: //函数实现在父节点的最前面插入新的节点

实现Iapp软件截取博客园随笔内容更改事件代码

代码如下           还没有完全写完, t() { .线程一.1 hs("http://www.cnblogs.com/BlmVac/p/5551737.html",null,null,codebh) f(codebh?"博客园") { .判断是否能截取网络数据1.1 sj(codebh,"是否提示*","*",proSwit) .tw(proSwit) f(proSwit==0) { .判断proSwit.1 sj(

在Python中用Request库模拟登录(二):博客园(简单加密,无验证码)

源代码分析 博客园的登录页面非常简单,查看网页源代码,可以发现两个输入框的id分别为input1.input2,复选框的id为remember_me,登录按钮的id为signin. 还有一段JavaScript代码,下面来简单分析一下. 先来看$(function(){});函数: 1 $(function () { 2 $('#signin').bind('click', function () { 3 signin_go(); 4 }).val('登 录'); 5 }); $(functio

python爬虫:两种方法模拟登录博客园

第一方法用第三方库(requests):参考http://www.mamicode.com/info-detail-1839685.html 源代码分析 博客园的登录页面非常简单,查看网页源代码,可以发现两个输入框的id分别为input1.input2,复选框的id为remember_me,登录按钮的id为signin. 还有一段JavaScript代码,下面来简单分析一下. 先来看$(function(){});函数: 1 $(function () { 2 $('#signin').bind

iOS_CNBlog项目开发 (基于博客园api开发)

按照惯例, 先上效果图 前言 很巧, 做这个项目是因为刚好在逛博客园的时候看到一篇文章 博客园第三方客户端-i博客园正式发布App Store, 这里就帮忙贴下链接啦, 毕竟我是由此而想说做这个项目的. 然而更巧的是, 和那篇文章的作者一样, 我也是刚毕业要找实习的人了(/(ㄒoㄒ)/~~), 开发容易找工不易, 哎, 做个项目练练手吧. 然后, 整个项目做下来大概做了半个月吧, 今天算是做出1.0版本啦, 已经贴上github(https://github.com/samAroundGitHu