javascript - 达到特定值后如何停止 JavaScript 事件
问题描述
我有一个简单的动态计算模板。如您所见,模板以a + b开头。当用户单击添加按钮时,将根据模板的最后一个元素显示两种类型的下拉列表。如果计算以值结束,将显示操作下拉菜单,反之亦然。这里的问题是,当模板作为一个完整的数学练习完成时,下拉菜单应该停止显示。像a + b + c,a + b + c + d和这里的下拉菜单应该在每次最后一个元素是值时消失,而不是操作。
document.querySelector('.container').addEventListener('click', e => {
const countItem = document.querySelector('.lists').childElementCount
if (countItem % 2 == 0) {
dropdown('dropdown-value')
} else {
dropdown('dropdown-operation')
}
});
document.querySelectorAll('.menu-list').forEach(list => list.addEventListener('click', e => {
const span = document.createElement('span');
span.textContent = e.target.textContent
document.querySelector('.lists').appendChild(span)
document.querySelector('.dropdown-value').style.display = 'none'
document.querySelector('.dropdown-operation').style.display = 'none'
}));
dropdown = (element) => {
document.querySelector(`.${element}`).style.display = 'block'
}
.container {
display: flex;
font-size: 20px;
margin-top: 2rem;
margin-left: 2rem;
}
a {
margin-left: 1rem;
}
ul {
margin: 0;
padding: 0;
}
.lists span {
padding: 1rem;
background: #f1f1f1;
margin-right: .2rem;
}
.add {
position: relative;
background: #290fff;
color: #fff;
padding: 5px;
cursor: pointer;
}
.dropdown-operation,
.dropdown-value {
width: 100%;
position: absolute;
left: 0;
background: #f1f1f1;
}
.dropdown-value li,
.dropdown-operation li {
display: block;
color: #000;
cursor: pointer;
padding: 5px;
border-bottom: 1px solid #000;
text-align: center;
}
<div class="container">
<div class="lists">
<span>a</span>
<span>+</span>
<span>b</span>
</div>
<a class="add"> Add
<!-- Dropdowns -->
<div class="dropdown-value" style="display: none;">
<ul class="menu-list">
<li>a</li>
<li>b</li>
<li>c</li>
<li>d</li>
</ul>
</div>
<div class="dropdown-operation" style="display: none;">
<ul class="menu-list">
<li>*</li>
<li>/</li>
<li>+</li>
<li>-</li>
</ul>
</div>
</a>
</div>
解决方案
这应该有效。
listen('.open');
listen('.dropdown-operation');
function listen(elem) {
document.querySelector(elem).addEventListener('click', e => {
const countItem = document.querySelector('.lists').childElementCount
if (countItem % 2 == 0) {
dropdown('dropdown-value')
} else {
dropdown('dropdown-operation')
}
});
}
document.querySelectorAll('.menu-list').forEach(list => list.addEventListener('click', e => {
const span = document.createElement('span');
span.textContent = e.target.textContent
document.querySelector('.lists').appendChild(span)
document.querySelector('.dropdown-value').style.display = 'none'
document.querySelector('.dropdown-operation').style.display = 'none'
}));
const dropdown = (element) => {
document.querySelector(`.${element}`).style.display = 'block'
}
.container {
display: flex;
font-size: 20px;
margin-top: 2rem;
margin-left: 2rem;
}
a {
margin-left: 1rem;
}
ul {
margin: 0;
padding: 0;
}
.lists span {
padding: 1rem;
background: #f1f1f1;
margin-right: .2rem;
}
.add {
position: relative;
background: #290fff;
color: #fff;
padding: 5px;
cursor: pointer;
}
.dropdown-operation,
.dropdown-value {
width: 100%;
position: absolute;
left: 0;
background: #f1f1f1;
}
.dropdown-value li,
.dropdown-operation li {
display: block;
color: #000;
cursor: pointer;
padding: 5px;
border-bottom: 1px solid #000;
text-align: center;
}
<div class="container">
<div class="lists">
<span>a</span>
<span>+</span>
<span>b</span>
</div>
<a class="add">
<div class='open'>add</div>
<!-- Dropdowns -->
<div class="dropdown-value" style="display: none;">
<ul class="menu-list">
<li>a</li>
<li>b</li>
<li>c</li>
<li>d</li>
</ul>
</div>
<div class="dropdown-operation" style="display: none;">
<ul class="menu-list">
<li>*</li>
<li>/</li>
<li>+</li>
<li>-</li>
</ul>
</div>
</a>
</div>
推荐阅读
- sql - 如何根据同一行的另一列更新各种 sql 列?
- java - Spring Boot com.fasterxml.jackson.core.JsonParseException:无法识别的令牌
- android - Flutter 无法在设备导入 androidx.annotation.Nullable 上运行应用程序
- selenium - Windows 10 - chromedriver.exe 返回我只允许本地连接
- mongodb - 如何删除嵌入在 MongoDB 子数组中的子文档(按 Id)?
- ecmascript-6 - 如何在 JSDoc 3 和 Babel.js 中使用装饰器?
- java - 为什么 Thread.join 的行为不符合预期
- mysql - 从表中找到至少在这些技术[reactjs, mysql, express] 方面工作过的人
- azure-ad-b2c - 如何找出导致 Azure B2C 500 内部服务器错误的原因?
- python - 根据第二个DataFrame的顺序和命名缩小一个DataFrame的形状