恶补jquery(四)jquery中事件--冒泡

事件

当我们在打开一个页面的时候,浏览器会对页面进行解释执行,这实际上是通过执行事件来驱动的,在页面加载事件时,执行Load()事件,是这个事件实现浏览器解释执行代码的过程。

事件机制

事件中的冒泡现象

冒泡现象说的是事件执行顺序,当一个对象上触发了一个事件,如果没有定义此事件的处理程序或者事件返回true,那么这个事件就会向这个对象的父级对象传播,从里到外,直到他被处理(父级对象所有同类事件都被激活),或者它到达了对象层次的顶层(即document对象)。

通俗的讲:假把设一杯水分成不同颜色的几层,加热水的时候,当底层中有一个气泡出现时,气泡会一层层的上升,直到最层顶部。而我们不管在哪一层观察都能捕捉到这个气泡,这杯水就是我们的”DOM“,”气泡“就是我们的事情气泡。

事件冒泡示例

如下代码所示

<span style="font-size:14px;"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JavaScript</title>
<style type="text/css">
#box {width:200px; height:100px; border:2px solid blue}
#box h5 {margin:0; padding:2px 5px; font-size:18px; text-align:right; background:blue; cursor:move}
#box h5 a {text-decoration:none; color:#FFF}
</style>
</head>

<body>
<div id="box">
<h5 onclick="startDrag();"><a onclick="closeBox();" href="javascript:void(0);">close</a></h5>
<div id="testInfo"></div>
</div>
<script type="text/javascript">
function startDrag()
{
    document.getElementById('testInfo').innerHTML += 'startDrag<br/>';
}
function closeBox()
{
    document.getElementById('testInfo').innerHTML += 'closeBox<br/>';
}
</script>
</body>
</html></span>

运行结果如图1:

图1

由此我们可以看到,对于同一事件来说(都是onclick事件),先是底层触发,再是上一层触发事件,也就是”从里向外冒泡“。

而当我们把父类的h5标签的事件改为onmousedown 的时候,我们会看到下面的结果。虽然针对冒泡而言应该是里层的先触发,但是对于事件onmousedown来说,触发时机遭遇onclick事件。

图2

那如何阻止冒泡?

js阻止冒泡现象

如下代码所示:

<span style="font-size:14px;"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JavaScript</title>
<style type="text/css">
#box {width:200px; height:100px; border:2px solid blue}
#box h5 {margin:0; padding:2px 5px; font-size:18px; text-align:right; background:blue; cursor:move}
#box h5 a {text-decoration:none; color:#FFF}
</style>
</head>

<body>
<div id="box">
<h5 onclick="startDrag();"><a onclick="closeBox();" href="http://blog.csdn.net/lovesummerforever">close</a></h5>
<div id="testInfo"></div>
</div>
<script type="text/javascript">
function startDrag()
{
    document.getElementById('testInfo').innerHTML += 'startDrag<br/>';

}
function closeBox(e)
{
    document.getElementById('testInfo').innerHTML += 'closeBox<br/>';
	stopPropagation(e);
}

function stopPropagation(e) {
    e = e || window.event;
    if(e.stopPropagation) { //W3C阻止冒泡方法
        e.stopPropagation();
    } else {
        e.cancelBubble = true; //IE阻止冒泡方法
    }
}
</script>
</body>
</html></span>

jquery阻止冒泡现象

如果是通过jquery访问的话,阻止冒泡现象方法如下

<span style="font-size:14px;"> $(function() {
            $("a").click(function(event) {
                  return false;
            });
 });</span>

或者

<span style="font-size:14px;">$(function() {
            $("a").click(function(event) {
                  event.stopPropagation();
            });
 });</span>

上述执行后,我们会发现,执行return false后,<a>标签不再跳转,而其他的都跳转,怎么阻止事件默认的跳转行为呢?

还有一个方法是event.preventDefault() ,该方法并不是处理事件的冒泡,而是阻止事件的默认行为。return false方法既阻止了冒泡,也阻止了事件的默认行为,event.stopPropagation()只阻止了事件的冒泡行为,但不阻止事件的默认行为。

时间: 2024-10-24 17:34:08

恶补jquery(四)jquery中事件--冒泡的相关文章

自己动手丰衣足食,h5手机端jquery弹窗插件(事件冒泡、单例模式、遮盖部分禁止默认滚动)

感谢浏览,欢迎交流=.= 公司开发微信网页多处需要使用弹窗,使用jquery-ui的定制化下载仍需要150多kb,想来有些奢侈(最终下来只有11kb,压缩后2kb,啊,我的神), 手机端弹窗方式与pc端有些不同,而且手机上有一个弹窗出来滚动跟父页面滚动相互影响的问题, 于是决定写一个插件,专门对付手机网页的弹窗. 弹窗的mask和dialog两部分都做成了position=fixed,比较喜欢这种效果,并且屏蔽了被遮住部分的滚动. 几处认为需要留意的知识点或困难点: 1.事件冒泡: e.prev

JS中事件冒泡(Bubble)和事件捕获(Capture)以及如何阻止事件的冒泡

对“捕获”和“冒泡”这两个概念,通常我们对冒泡了解和使用的会更多一些,因为在我们使用的所有浏览器中,都支持事件冒泡 ,即事件由子元素向祖先元素传播的,就 像气泡从水底向水面上浮一样.而在像firefox,chrome,safari这类所谓的标准浏览器中,事件传播通常是有三个阶段的:事件捕获阶段,事件目标阶段,事件冒泡阶段,这三者的执行的顺序是先捕获在冒泡.对于捕获阶段,这个很少 有用武之地,所以被人疏忽遗忘也在所难免了,不常用不代表它不存在,本着科学严谨的态度,我们有必要去看一下它的庐山真面目.

js中事件冒泡及阻止冒泡的一小段code

在有些情况下, 事件冒泡会给我们的应用程序带来负面的影响. 比如下面的例子(有些极端): <html> <head> <title></title> <script> window.onload = function(){ var all = document.getElementsByTagName('*'); for(var i = 0; i < all.length; i++){ console.log('xxx'); all[i].

js中事件冒泡和事件捕获

什么时候存在这种问题? 当一个行为触发了多个对象的事件时. <body> <div class="fa"> <div class="son1"> <div class="son2"></div> </div> </div> <script type="text/javascript"> var fa = document.getEl

react中事件冒泡之填坑

今天在写个组件,大致代码是这样的: class Switch extends React.Component { handlerChange = (e) => { const {onChange} = this.props; onChange && onChange(e); } render(){ const {checkedLabel, uncheckedLabel, small, ...others} = this.props; const isSmall = size ===

##阻止事件冒泡和取消默认操作

取消事件冒泡 事件冒泡指当一个元素的事件被触发的时候,比如鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发,这个过程被称为事件冒泡.这个事件是从原始元素开始一直冒泡到DOM树的最上层.事件传播的3个阶段:捕获.冒泡.目标阶段. 阻止事件冒泡:w3c的方法是event.stopPropagation(),IE则是使用event.cancelBubble = true; 兼容性写法: var event = event || window.event; if(event &&

JavaScript事件冒泡简介及应用

一.什么是事件冒泡 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事 件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对 象层次的最顶层,即document对象(有些浏览器是window). 打个比方说:你在地方法院要上诉一件案子,如果地方没有处理此类案件的法院,地方相关部门会帮你继续往上级法院上诉,比如从市级到省

深入理解JavaScript事件冒泡

一.什么是事件冒泡 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window). 打个比方说:你在地方法院要上诉一件案子,如果地方没有处理此类案件的法院,地方相关部门会帮你继续往上级法院上诉,比如从市级到省级,

转:JavaScript事件冒泡简介及应用

(本文转载自别处) JavaScript事件冒泡简介及应用 一.什么是事件冒泡 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window). 打个比方说:你在地方法院要上诉一件案子,如果地方没有处理此类案件的法