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

通常我们会写成:

  $(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. px,em,rem的区别

    PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位: 3. Firefox能够调整px和em,rem,但是96%以上 ...

  2. java_Oralce

    简单范例 create or replace procedure delete_table is i number(10); begin for x in (select * from emp whe ...

  3. java_闭包和回调实现一边按键盘一边演讲

    package ming; interface Teachable { void work(); } class Programer { private String name; public Str ...

  4. redis终于有比较大的进展了,redis3.0.1 稳定版本发布,支持集群。

    原文地址:https://raw.githubusercontent.com/antirez/redis/3.0/00-RELEASENOTES Redis 3.0 release notes --[ ...

  5. vim中光标的前进和后退

    流行的文本编辑器通常都有前进和后退功能,可以在文件中曾经浏览过的位置之间来回移动.在 vim 中使用 Ctrl-O 执行后退,使用 Ctrl-I 执行前进.相关帮助: :help CTRL-O  :h ...

  6. 小白日记22:kali渗透测试之提权(二)--抓包嗅探

    抓包嗅探 通过抓包嗅探目标机器的流量,发现账号密码. Windows系统 1.Wirehshark 2.Omnipeek 3.commview 4.Sniffpass 只会抓取识别传输密码的明文协议, ...

  7. sql server 2008 com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机

    右击我的电脑,点击管理 右击"TCP/IP"选择"属性"(或双击"TCP/IP"),选择"IP地址"选项卡,最下面有个& ...

  8. [转]"Windows Phone 7程序设计”完全版电子书可以免费下载了

    本文转自:http://www.cnblogs.com/salam/archive/2010/10/29/1864246.html 现在学习Windows Phone 7开发资料十分有限,除了MSDN ...

  9. [转]WIN7服务一些优化方法

    本文转自:http://bbs.cfanclub.net/thread-391985-1-1.html Win7的服务,手动的一般不用管他,有些自动启动的,但对于有些用户来说是完全没用的,可以考虑禁用 ...

  10. hdu 4605 线段树与二叉树遍历

    思路: 首先将所有的查询有一个vector保存起来.我们从1号点开始dfs这颗二叉树,用线段树记录到当前节点时,走左节点的有多少比要查询该节点的X值小的,有多少大的, 同样要记录走右节点的有多少比X小 ...