javascript - 通过单击打开 div 并通过单击外部关闭
问题描述
一个 div 最初是隐藏的,我想在单击按钮时显示它。一旦它可见,我想在单击该 div之外的任何位置时隐藏它。
我正在尝试以下代码,它显示 div,但问题出在框的第二部分(单击外部)。第二部分与第一部分冲突,因此在显示之前将其隐藏。
我该如何解决?
$('button').on('click', function(e){
e.preventDefault();
$('.box').addClass('active');
});
//hide is by clicking outside .box
$(document).on('click', function (e) {
if ($('.box').is(':visible') && !$('.box').is(e.target) && !$('.box').has(e.target).length) {
$('.box').hide();
}
});
button {
margin-bottom: 20px;
}
.box {
width: 200px;
height: 120px;
background: #fab1a0;
display: none;
}
.active {
display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button>Click</button>
<div class="box"></div>
解决方案
您可以停止您的传播,event
以便在单击按钮时事件不会冒泡到document
. 也不是hide()
, 只是 usingremoveClass(...)
应该适合你。
此外,事件传播不会在此按钮侦听器本身中停止,而是从下一个事件侦听器开始,在您的情况下,该事件侦听器在文档上,这就是我们所需要的。
$('button').on('click', function(e){
e.stopPropagation();
$('.box').addClass('active');
});
//hide is by clicking outside .box
$(document).on('click', function (e) {
if ($('.box').is(':visible') && !$('.box').is(e.target) && !$('.box').has(e.target).length) {
$('.box').removeClass('active');
}
});
button {
margin-bottom: 20px;
}
.box {
width: 200px;
height: 120px;
background: #fab1a0;
display: none;
}
.active {
display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button>Click</button>
<div class="box"></div>
推荐阅读
- azure - Microsoft Azure 中的资源组、存储帐户和可用性集
- c# - 有没有办法强制在浏览器中查看或下载附件?
- android - 如何在Android中制作线性显示动画而不是圆形显示动画?
- javascript - 如何从客户端获取 CSV 文件上传请求并解析数据以上传到 nodejs 的 mySql 数据库中
- javascript - 如何检索本地存储的 sql 文件并将其以 json 数据格式解析为 QML 中的外部 url?
- php - Vuejs 在 flash 组件中显示 Laravel 错误
- javascript - 使用 moment.utc() 错误地将日期转换为“天”格式的 utc 格式-Moment Javascript
- php - 我的 laravel 项目起始页打不开
- php - 在codeigniter中的多个复选框的表中更新值0而不是数组
- ios - 无法将应用上传到 Apple Testflight - 需要管理员身份