javascript - 单击事件仅在类的一个元素上触发
问题描述
我有这样的卡片布局,每张卡片都有这个标记:
<div class="card">
<div class="content">
<div class="brand">
<img src="/assets/logo.png" alt="">
</div>
<div class="name">
<h3>Lorem ipsum</h3>
</div>
<div class="price">
25€/year
</div>
<div class="buttons">
<a href="#" class="btn btn-color">Buy</a>
<a href="#" class="btn btn-ghost overlay-toggle">Details</a>
</div>
</div>
<div class="details">
...Details here...
</div>
</div>
当我单击详细信息按钮时,我希望详细信息 div 弹出卡片。我可以按我的意愿工作,但问题是事件会同时在所有卡片上触发,而不仅仅是我单击按钮的那个。
这是点击的 jQuery:
var overlayToggle = $('.overlay-toggle');
var overlayClose = $('.close-overlay');
var overlay = $('.details');
overlayToggle.on('click', (e) => {
e.preventDefault();
overlay.css({
'visibility': 'visible',
'opacity': '1',
'transform': 'scale(1)'
});
});
overlayClose.on('click', () => {
overlay.css({
'visibility': 'hidden',
'opacity': '0',
'transform': 'scale(0)'
});
});
解决方案
问题是您已定义overlay
为包含所有details
元素的 JQuery 包装集,并且在每个事件处理程序中,您告诉整个集显示或隐藏。
您需要做的是,在事件处理程序中,仅找到details
与单击的按钮相对应的元素。
var overlayToggle = $('.overlay-toggle');
var overlayClose = $('.close-overlay');
overlayToggle.on('click', (e) => {
e.preventDefault();
// Find the .details within nearest ancestor that is .card
$(".details", $(e.target).closest(".card")).css({
'visibility': 'visible',
'opacity': '1',
'transform': 'scale(1)'
});
});
overlayClose.on('click', () => {
overlay.css({
'visibility': 'hidden',
'opacity': '0',
'transform': 'scale(0)'
});
});
.details { visibility:hidden; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="card">
<div class="content">
<div class="brand">
<img src="/assets/logo.png" alt="">
</div>
<div class="name">
<h3>Lorem ipsum</h3>
</div>
<div class="price">
25€/year
</div>
<div class="buttons">
<a href="#" class="btn btn-color">Buy</a>
<a href="#" class="btn btn-ghost overlay-toggle">Details</a>
</div>
</div>
<div class="details">
...Details here...
</div>
</div>
<div class="card">
<div class="content">
<div class="brand">
<img src="/assets/logo.png" alt="">
</div>
<div class="name">
<h3>Lorem ipsum</h3>
</div>
<div class="price">
25€/year
</div>
<div class="buttons">
<a href="#" class="btn btn-color">Buy</a>
<a href="#" class="btn btn-ghost overlay-toggle">Details</a>
</div>
</div>
<div class="details">
...Details here...
</div>
</div>
<div class="card">
<div class="content">
<div class="brand">
<img src="/assets/logo.png" alt="">
</div>
<div class="name">
<h3>Lorem ipsum</h3>
</div>
<div class="price">
25€/year
</div>
<div class="buttons">
<a href="#" class="btn btn-color">Buy</a>
<a href="#" class="btn btn-ghost overlay-toggle">Details</a>
</div>
</div>
<div class="details">
...Details here...
</div>
</div>
推荐阅读
- azure - 为 Azure 数据工厂服务设置灾难恢复
- wordpress - 带有 Google UrlFetchApp 标头授权的 WooCommerce REST API 不起作用
- javascript - 自动登录到 ASP.Net Web 表单站点
- python - 为什么这个循环会持续运行(要求玩家轮到他们)?
- excel - 30、60、90 天范围内的 COUNTIFS 问题
- python - 无法使用请求从每个结果的内页中抓取名称
- python-3.x - PyCharm 中 ndb Google Cloud Datastore 的类型提示丢失
- javascript - 在反应中通过数据列表发送数据
- javascript - 根据其中的文本对元素进行排序
- html - Scrape Web Page When Selector Does Not Update URL