javascript - 多次调用函数时避免数字多次递增
问题描述
我写了一个数量选择器函数来显示在页面上。该页面可以打开一些模态框,每个模态框内需要有另一个数量选择器。
我在主页和模态框内调用该函数(以在显示模态框后启用该功能。)
当我在模态中调整数量,关闭模态,并在主页上调整数量时,数量增加/减少两倍(如果我要调用该函数3次,则增加3倍。)
有没有办法“重置”这些事件侦听器/函数中的每一个,只针对它们各自的元素进行调整?
我研究了“removeEventListener”,但在我的代码中实现它并没有任何乐趣。
到目前为止我的工作示例在这里(如果您单击按钮,您可以看到我的意思。)
https://codepen.io/777333/pen/zYoKYRN
const quantitySelector = () => {
const qtyGroups = document.querySelectorAll('.qty-group');
if(qtyGroups) {
qtyGroups.forEach((qtyGroup) => {
const qtyDecrease = qtyGroup.querySelector('[data-quantity-decrease]');
const qtyIncrease = qtyGroup.querySelector('[data-quantity-increase]');
const qtyInput = qtyGroup.querySelector('[data-quantity-input]');
const disableEnableDecrease = () => {
if(qtyInput.value == 1) {
qtyDecrease.disabled = true;
} else {
qtyDecrease.disabled = false;
}
};
qtyDecrease.addEventListener('click', (event) => {
event.preventDefault();
if(qtyInput.value > 1) {
qtyInput.value--;
}
disableEnableDecrease();
});
qtyIncrease.addEventListener('click', (event) => {
event.preventDefault();
qtyInput.value++;
disableEnableDecrease();
});
qtyInput.addEventListener('keyup', () => {
disableEnableDecrease();
});
});
}
};
quantitySelector(); // called within main page
quantitySelector(); // called within modal
解决方案
您可以保存qtyInput
on mousedown
event 的值,然后在增量中从保存的值而不是输入的当前值中添加或减去 1。
const quantitySelector = () => {
const qtyGroups = document.querySelectorAll('.qty-group');
if(qtyGroups) {
qtyGroups.forEach((qtyGroup) => {
const qtyDecrease = qtyGroup.querySelector('[data-quantity-decrease]');
const qtyIncrease = qtyGroup.querySelector('[data-quantity-increase]');
const qtyInput = qtyGroup.querySelector('[data-quantity-input]');
const disableEnableDecrease = () => {
if(qtyInput.value == 1) {
qtyDecrease.disabled = true;
} else {
qtyDecrease.disabled = false;
}
};
let savedValue = null;
const saveState = (evebt) => savedValue = Number(qtyInput.value);
qtyDecrease.addEventListener('mousedown', saveState)
qtyIncrease.addEventListener('mousedown', saveState)
qtyDecrease.addEventListener('click', (event) => {
event.preventDefault();
event.stopPropagation();
if(qtyInput.value > 1) {
qtyInput.value = savedValue - 1;
}
disableEnableDecrease();
});
qtyIncrease.addEventListener('click', (event) => {
event.preventDefault();
event.stopPropagation();
qtyInput.value = savedValue + 1;
disableEnableDecrease();
});
qtyInput.addEventListener('keyup', () => {
disableEnableDecrease();
event.stopPropagation();
});
});
}
};
quantitySelector();
quantitySelector();
推荐阅读
- visual-studio-code - 在 VSCode 中使部分行可复制
- node.js - HttpClient 的请求超时
- javascript - 使用 Javascript 更改 url 时的重定向循环
- python-3.x - Tensorflow:如何使用与多个进程并行运行的 fit() 生成器
- linux - 从 shell 脚本杀死并重新启动应用程序
- python - wxPython 改变 UI 的外观
- r - df_parse_dta_file() 中的错误:无法解析 C:/Users/folder/data.dta:不支持此版本的文件格式
- reactjs - 防止路线被渲染
- python - 过程在调用 exec sp 时工作,但在使用 process.exit() 命令从 c# 执行时失败
- entity-framework-6 - EntityFramework Extensions UpdateFromQuery 中的无效更新表达式异常