js利用事件的阻止冒泡实现点击空白模态框的隐藏


Posted in Javascript onJanuary 24, 2014

很多时候,我们做前端的时候都会有这样的小功能,点击弹出某个框框,但是,有时候不想操作,就想点击某个空白处,隐藏该框框。假设如下场景,一个小按钮,点击可以弹出一个模态框。

就这么简单,但是我们想要点击空白部分的时候隐藏模态框,加入按钮id:btn,模态框id:model

也许我们最简单的思路就是直接在document上监听一个事件,伪代码如下:

按钮点击弹出事件监听:

$("#btn").bind("click",function(e){ 
if(e.stopPropagation){//需要阻止冒泡 
e.stopPropagation(); 
}else{ 
e.cancelBubble = true; 
} 
})

$(document).bind("click",function(e){ 
if(点击事件不在model上){ 
隐藏模态框; 
} 
})

乍一看,这是没有问题的,但是,其实有很多问题,首先,我们得注意阻止冒泡,否则,点击按钮,实际是触发了上面两个事件,modal是弹不出来的,其实是弹出来了,立马又隐藏了,而且,当我们在模态框上还有许多小控件的时候,我们对于模态框中的点击就很难进行判断。

这里,我认为有一种最经典的方法,很简单,但是很巧妙,

首先,对于模态框监听一个事件如下:

$("#modal").bind("click", function(event) { 
if (event && event.stopPropagation) { 
event.stopPropagation(); 
} else { 
event.cancelBubble = true; 
} });

只是简单阻止模态框中的点击事件冒泡,

然后:

$(document).one("click", function(e){ 
var $target = $(e.currentTarget); 
if ($target.attr("id") != "modal") { 
$("#modal").css("display", "none"); 
} 
});

搞定,so easy
Javascript 相关文章推荐
jquery 问答知识整理
Feb 11 Javascript
cloudgamer出品ImageZoom 图片放大效果
Apr 01 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
Jul 10 Javascript
jquery修改网页背景颜色通过css方法实现
Jun 06 Javascript
JS实现点击上移下移LI行数据的方法
Aug 05 Javascript
JavaScript编程中布尔对象的基本使用
Oct 25 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
Jan 13 Javascript
JS内部事件机制之单线程原理
Jul 02 Javascript
微信小程序http连接访问解决方案的示例
Nov 05 Javascript
Vue源码分析之Vue实例初始化详解
Aug 25 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
Sep 10 Javascript
ligerUI的ligerDialog关闭刷新的方法
Sep 27 Javascript
JS实现点击链接取消跳转效果的方法
Jan 24 #Javascript
js关于字符长度限制的问题示例探讨
Jan 24 #Javascript
JS方法调用括号的问题探讨
Jan 24 #Javascript
Array栈方法和队列方法的特点说明
Jan 24 #Javascript
js sort 二维数组排序的用法小结
Jan 24 #Javascript
js二维数组排序的简单示例代码
Jan 24 #Javascript
js中数组(Array)的排序(sort)注意事项说明
Jan 24 #Javascript
You might like
星际争霸兵种名称对照表
2020/03/04 星际争霸
redis 队列操作的例子(php)
2012/04/12 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
PHP序列化操作方法分析
2016/09/28 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
BootStrap扔进Django里的方法详解
2016/05/13 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
js图片延迟加载(Lazyload)三种实现方式
2017/03/01 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
vue-video-player 断点续播的实现
2021/02/01 Vue.js
Python编写检测数据库SA用户的方法
2014/07/11 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
2020/02/09 Python
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
Amcal中文官网:澳洲综合性连锁药房
2019/03/28 全球购物
幼儿园中班评语大全
2014/04/17 职场文书
幼儿园清明节活动总结
2014/07/04 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书
2014年业务工作总结
2014/11/17 职场文书
大学生入党自传2015
2015/06/26 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
Python实现简繁体转换
2021/06/07 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python
Nginx实现会话保持的两种方式
2022/03/18 Servers