在我们书写一个弹窗的时候,我们往往需要点击弹窗的其他地方来隐藏弹窗。

通常我们会写成:

  $(document).bind('click',function(){
$('.pop-box').hide();
});

“然并卵” , 这个时候我们就需要防止事件冒泡。

jQuery 里面提供了 return false; 和 event.stopPropagation(); 来防止冒泡。

通常我们会将 return false; 用在 form 表单提交验证上。

event.stopPropagation(); 来防止 点击事件 冒泡。

然而,我需要的功能需求是:

需求1:

  1. 点击某个按钮 出现弹窗;
  2. 点击弹窗周围, 弹窗隐藏(点击弹窗, 弹窗不隐藏);
  3. 点击弹窗上的 X , 弹窗隐藏。

方法1: 利用遮罩层来,控制点击区域。

添加一个 cover 层,点击 cover 层的时候 隐藏弹层。

html

  <div class="cover"></div>
<div class="pop-box"><span class="x-btn">X</span></div>
<button class="pop-btn">POP</button>

css

  .cover {
display: none;
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: 9998;
}
.pop-box {
position: absolute;
width: 400px;
height: 400px;
margin-left: 20px;
margin-top: 20px;
display: none;
z-index: 9999;
}

js

  $(function() {
$('.pop-btn').click(function() {
$('.pop-box, .cover').show();
});
$('.cover, .x-btn').click(function() {
$('.cover, .pop-box').hide();
});
});

效果预览

需求2

  1. 点击按钮出现 list 选择弹层,
  2. 点击 list 选项后,操作选项, 隐藏弹层,
  3. 点击 list 其他地方,隐藏弹层。

html

  <div class="subject-select select">
<div class="divselect" disabled="true">
<cite>请选择所授科目</cite>
<ul>
<li><a href="javascript:;" selectid="1">数学</a></li>
<li><a href="javascript:;" selectid="2">英语</a></li>
<li><a href="javascript:;" selectid="3">物理</a></li>
<li><a href="javascript:;" selectid="4">化学</a></li>
<li><a href="javascript:;" selectid="5">生物</a></li>
<li><a href="javascript:;" selectid="6">历史</a></li>
<li><a href="javascript:;" selectid="7">地理</a></li>
<li><a href="javascript:;" selectid="8">政治</a></li>
<li><a href="javascript:;" selectid="9">语文</a></li>
<li><a href="javascript:;" selectid="10">其他</a></li>
</ul>
</div>
<input name="subject" type="hidden" value="" class="inputselect" />
</div>
</div>

css

  .divselect {
width: 240px;
height: 40px;
z-index: 9900;
}
.divselect ul,
.divselect li {
margin: 0;
padding: 0;
font-size: 13px;
list-style: none;
} .divselect cite {
width: 206px;
height: 40px;
line-height: 40px;
display: block;
font-size: 14px;
cursor: pointer;
font-style: normal;
padding-left: 4px;
padding-right: 30px;
border: 1px solid #cccccc;
background: url(../image/xjt.png) no-repeat right center;
} .divselect ul {
width: 240px;
border: 1px solid #cccccc;
background-color: #ffffff;
position: absolute;
z-index: 20000;
margin-top: -1px;
display: none;
} .divselect ul li {
height: 24px;
line-height: 24px;
} .divselect ul li a {
display: block;
height: 24px;
color: #333333;
text-decoration: none;
padding-left: 10px;
padding-right: 10px;
} .divselect ul li a:hover {
background-color: #CCC;
}

js

  (function($) {
$.extend($.fn, {
divselect: function(divSelect, inputSelect, callback) {
var $that = $(this);
$that.find('cite').click(function(event) {
$that = $(this).parents('.select');
var ul = $that.find('ul');
if (ul.css('display') === 'none') {
ul.slideDown('fast');
} else {
ul.slideUp('fast');
}
event.stopPropagation();
});
$that.find('ul li a').click(function(event) {
var txt = $(this).text();
$that.find('cite').html(txt);
var value = $(this).attr('selectid');
$that.find('.' + inputSelect).val(value);
$that.find('ul').hide();
});
$(document).click(function(event){
$that.find('ul').hide();
event.stopPropagation();
});
}
});
}(jQuery)); $(function() {
$('.select').divselect('divselect', 'inputselect', function(){});
});

效果预览

JavaScript 防止事件冒泡的更多相关文章

  1. JavaScript 阻止事件冒泡的实现方法

    JavaScript 阻止事件冒泡,无使用其它插件来辅助,原生JS代码,考虑到浏览器的兼容性问题,这里对IE/火狐.Operating以及Chrome都有针对性的判断,代码如下: function c ...

  2. JavaScript(3)---事件冒泡、事件捕获

    JavaScript(3)---事件冒泡与事件捕获 一.理解冒泡与捕获 假设有这么一段代码 <body> <div><p>标签</p> </div ...

  3. 浅谈javascript中事件冒泡与事件捕获

    事件冒泡:一个事件会顺着他的层级一直往上传,一直传到document上为止,即从盒模型上看是从内到外的过程. 例: <!DOCTYPE html><html lang="e ...

  4. javascript阻止事件冒泡的兼容写法及其相关示例

    //阻止事件冒泡的兼容写法 function stopBubble(e){ //如果提供了事件对象,则是一个非IE浏览器 if(e && e.stopPropagation) //因此 ...

  5. javascript 停止事件冒泡以及阻止默认事件冒泡

    停止事件冒泡 function stopBubble(e) { // 如果提供了事件对象,则这是一个非IE浏览器 if ( e && e.stopPropagation ) { // ...

  6. JavaScript阻止事件冒泡(兼容IE、Chrome、FF)

    这里仅仅是一个简单代码demo,因为时间问题并未做深入研究,因为今天做项目时要用到阻止事件冒泡的内容,找了好多才找到一个可以使用的,特记录之. <!DOCTYPE HTML> <ht ...

  7. javascript的事件冒泡,阻止事件冒泡和事件委托, 事件委托是事件冒泡的一个应用。

    首先,弄明白js 当中,什么是事件,事件模型在js中是如何设计的.什么是事件冒泡? 什么是“事件冒泡”呢?假设这里有一杯水,水被用某种神奇的方式分成不同颜色的几层.这时,从最底层冒出了一个气泡,气泡会 ...

  8. javascript的事件冒泡【转】

    出处:http://www.cnblogs.com/sanshi/archive/2009/02/18/1393165.html (感谢三生石上) 这是一个基础性的文章,使用Javascript观察D ...

  9. 探讨JavaScript的事件冒泡

    JavaSciprt事件中有两个很重要的特性:事件冒泡以及目标元素. 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这一过程被称为事件冒泡: ...

随机推荐

  1. 哈夫曼(Huffman)编码

    哈夫曼编码(Huffman Coding)是一种非常经典的编码方式,属于可变字长编码(VLC)的一种,通过构造带权路径长度最小的最优二叉树以达到数据压缩的目的.哈弗曼编码实现起来也非常简单,在实际的笔 ...

  2. 关于 error: LNK1123: failure during conversion to COFF: file invalid or corrupt 错误的解决方案【Qt】【 VS2010】

    近日因为换装硬盘重装了系统,于是不得不重新安装VS2010 Qt 这些个开发工具.安装过程都没什么问题,安装完了顺手点了个例子测试下好没好用,于是就出现了标题中的错误提示.之前处理过一次,时间久了就忘 ...

  3. CCTableView的使用和注意事项

    #include "cocos-ext.h" using namespace cocos2d::extension; class TableViewTestLayer: publi ...

  4. tlb转dll

    项目中需要用到c++编写的dll文件,但是同事发给我的是一个tlb后缀的文件,此时需要用到vs命令工具,具体操作如下: 开始-->vs2010-->vs命令提示(2010) ,打开后,输入 ...

  5. Simple Arithmetics

    def Add(a, b): l = [] alen = len(a) blen = len(b) result = str(int(a) + int(b)) relen = len(result) ...

  6. Eclipse 中引用其他项目及项目打包

    1.建立工程project1; 2.建立class文件ClassA: package com.test; public class ClassA{ public static String getCl ...

  7. jQurey对表单表格的操作及更多应用(方法型)

  8. HDOJ2001计算两点间的距离

    计算两点间的距离 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  9. Android应用中-更新提示显示红点的方案

    什么是红点更新提示? 红点更新提示类似微信朋友圈有新的朋友消息 时会在“发现”tab上显示红点,表示有新的消息. 目前三种显示方式: 1.显示具体数字 2.只显示红点 3.显示省略,表示数量很多 方案 ...

  10. JAVA之经典Student问题1

    通过“三目运算符”求最大值与最小值. class student { //定义学生编号 private String stu; //学生姓名 private String name; //学生书信成绩 ...