原地址:http://missra.com/article/web-57.html

嵌套的标签元素,如果父元素和子元素都绑定了一些事件,那么在点击最内层子元素时可能会触发父级元素的事件,下面介绍一下JavaScript阻止默认事件与JavaScript阻止事件冒泡示例。

(1)阻止冒泡事件

注:嵌套元素一般都存在冒泡事件,会带来某些影响

最外层标签:outer,中间层标签:center,最内层标签:inner,并且在outer、center、inner都添加了alert弹框事件,在正常思维情况下如果只点击内层元素,只会弹出绑定在该元素上的alert事件,但是,由于冒泡事件的原因,如果只点击内层元素首先触发被点击的内层元素的事件,然后会依次向外(向上级)冒泡触发外层事件,如下:

outer

center

inner

HTML:

1
2
3
4
5
<div id="outer" onclick="alert('Outer');">outer
    <div id="center" onclick="alert('Center');">center
        <div id="inner" onclick="alert('Inner');">inner</div>
    </div>
</div>

CSS:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#outer {
    width:300px;
    border:1px solid #888;
    text-align:center;
    backgrond-color:#888;
    margin:0 auto;
}
#center {
    margin:20px;
    border:1px solid #aaa;
    text-align:center;
    backgrond-color:#aaa;
}
#inner {
    margin:20px;
    border:1px solid #ccc;
    text-align:center;
    text-align:center;
    backgrond-color:#ccc;
}

试想如果在项目开发中,某个按钮和他的父级同时绑定了很重要的事件,那么结果会惨不忍睹,这时的处理方法就是阻止冒泡事件,用下面的JS来阻止冒泡事件的发生。

JS代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var outerDom = document.getElementById("outer");
var centerDom = document.getElementById("center");
var innerDom = document.getElementById("inner");
 
//阻止冒泡事件
function stopBubble(e) {
if (e && e.stopPropagation) {
e.stopPropagation();
    } else {
window.event.cancelBubble = true;
    }
 
//等价语句
//window.event ? e.stopPropagation() : window.event.cancelBubble = false;
 
}
 
//为每个元素对象添加监听事件,如果监听到元素触发"click"事件,就引用上面阻止冒泡的方法stopBubble()来阻止冒泡事件的发生
outerDom.addEventListener("click",function(e) {
stopBubble(e);
})//阻止outer冒泡
 
centerDom.addEventListener("click",function(e) {
stopBubble(e);
})//阻止center冒泡
 
innerDom.addEventListener("click",function(e) {
stopBubble(e);
})//阻止inner冒泡

用以上的JS代码阻止冒泡事件后效果如下:

outer

center

inner

(2)阻止默认事件

在前端开发工作中,由于浏览器兼容性等问题和一些特殊用处,比如禁止浏览器右键、禁止浏览器菜单等,需要用到阻止浏览器的默认事件

示例:阻止超链接

如下链接

http://www.missra.com

阻止打开链接此默认事件,JS代码如下


1
2
3
4
5
6
7
8
9
10
11
12
13 var aDom = window.document.getElementById("a");
aDom.onclick = function (e) {
    //如果提供了事件对象,则这是一个非IE浏览器
    if (e && e.preventDefault) {
        //阻止默认浏览器动作(W3C)
        e.preventDefault();
    }
    else {
        //IE中阻止函数器默认动作的方式
        window.event.returnValue = false;
        return false;
    }
}

使用以上JS脚本后的效果如下:

http://www.missra.com

点击链接的时候正常情况下会发生跳转,但是现在我们阻止了它的默认事件,即跳转事件,这时就不会跳转到玫莎了(备注:由于网站编辑器的原因无法给链接添加ID,所以演示的链接还是能打开)。

(3)jQeury阻止默认和冒泡事件

备注:一下代码中的"a"是元素标签,可以是"#id"或者".class"或者DOM对象

阻止冒泡事件


1
2
3 $("a").click(function (e) {
    e.stopPropagation();
});

阻止默认事件


1
2
3 $("a").click(function (e) {
    e.preventDefault();
});

阻止默认和冒泡事件


1
2
3 $("a").click(function (e) {
    return false;
});

JS如果阻止事件冒泡和浏览器默认事件的更多相关文章

  1. js中阻止事件冒泡和浏览器默认行为

    在使用javascript编程时会遇到一个问题,就是当你给html添加事件时,由于浏览器默认的为冒泡型事件触发机制,所以会触发你不想触发的事件.那么通过如下的函数可以解决这个问题.[兼容IE和FF] ...

  2. JS 事件冒泡整理 浏览器的事件流

    JavaScript与HTML的交互通过事件来实现.而浏览器的事件流是一个非常重要的概念.不去讨论那些古老的浏览器有事件捕获与事件冒泡的争议, 只需要知道在DOM2中规定的事件流包括了三个部分,事件捕 ...

  3. JS事件——禁止事件冒泡和禁止默认事件

    Event 对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 事件通常与函数结合使用,函数不会在事件发生前被执行! 一.什么是事件冒泡 在一 ...

  4. javascript(九)事件冒泡 onmouseenter onmouseenter 默认事件 和 键盘事件

    1 事件冒泡 子元素触发的事件,会往上(父元素)传递: 例子: <div id="box"> <p></p> </div> < ...

  5. JS阻止事件冒泡与浏览器默认行为

    阻止冒泡 W3C的方法是e.stopPropagation() IE是e.cancelBubble = true; 阻止默认行为 W3C的方法e.preventDefault(), IE是e.retu ...

  6. 理解阻止浏览器默认事件和事件冒泡cancelBubble

    一.阻止浏览器默认事件 1.先举个例子说什么是 浏览器的默认事件 : 比如有一个输入框,当我按下字母a,就会在输入框显示字母a.就是浏览器本该发生的事情.小孩子一出生就会汲取母乳一样的道理,这些都是先 ...

  7. 一个取消事件的简单js例子(事件冒泡与取消默认行为)

    先上代码: <div id='outer' onclick='alert("我是outer")'> <div id="middle" oncl ...

  8. js /jquery停止事件冒泡和阻止浏览器默认事件

    1>js阻止冒泡事件 var el = window.document.getElementById("a"); el.onclick = function (e) { // ...

  9. javascript阻止事件冒泡和浏览器的默认行为

    1.阻止事件冒泡,使成为捕获型事件触发机制. 1 function stopBubble(e) { 2 //如果提供了事件对象,则这是一个非IE浏览器 3 if ( e && e.st ...

随机推荐

  1. 四、XML映射配置文件

    MyBatis的XML配置文件包含了影响MyBatis行为甚深的设置和属性信息.XML文档的高层级结构如下: ----configuration配置 --------properties属性 ---- ...

  2. get-random生成电话号码

    "138"+((0..9|Get-Random -count 10) -join $null) From:http://blog.csdn.net/shrekz/article/d ...

  3. Windows下Apache+Tomcat+jsp+php的服务器整合配置经验总结

    对于Apache+Tomcat+jsp+php的整合,针对不同的Tomcat和apache的版本,稍微有些区别. 一.所需软件 (1)JDK: jdk-7u15-windows-x64.exejdk的 ...

  4. 用sp_addlinkedserver建立链接服务器(sql server2008中通过测试)

    --在SQL SERVER 2008里,可以按以下的方式建立链接服务器 ? EXEC  sp_addlinkedserver          @server='Test',--这里是给链接服务器取的 ...

  5. 关于Xcode7中的tbd文件

    tbd 是 text-based stub libraries的意思, 是苹果在Xcode7中使用的一个技术,便于减少Xcode7中SDK的体积. 下面讲解下Xcode7如何通过tbd这个技术减少SD ...

  6. Servlet中字节字符流的输出

    public class OutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServ ...

  7. position定位问题

    position属性规定了元素的定位类型,默认为static.该属性还可以有下值:absolute:生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位.fixed:生成绝对定位的 ...

  8. jQuery导航菜单防刷新

    为了实现最主要的功能,只写了一个粗糙的案例 CSS样式 ul,li{ list-style-type:none;} .nav { width: 100%; height: 35px; line-hei ...

  9. HeaderViewListAdapter cannot be cast to listAdapter问题原因及解决办法

    [o] 在listView中添加leaderView 和footerView的时候要注意在setAdapter之前调用,不然会报如下异常: listAdapter cannot be cast to ...

  10. 无可匹敌的创建job(细化很多细节)

    declare  jobno           binary_integer ;  rm_days         number := 15; --保留多少天的数据,单位天数  rm_hour    ...