javascript - 如何防止函数使用旧的函数参数
问题描述
我正在尝试在单击时传递带有参数的函数,如果我每次都提交模态,它会很好地工作。
但是,如果我取消它,然后再次单击按钮并提交,则该函数被调用两次,参数错误
重现步骤:
- 单击数字 2 -> 取消 -> 单击数字 1 -> 提交 -> 它将记录两个数字而不是一个
如何让它“忘记”以前的参数并仅使用在该函数中传递的参数?
function showModal(body, onSubmit) {
$("#number-modal").modal("show");
$("#number-message").html("").html(body);
$('[data-click="confirm"]').click(function () {
$(this).off("click");
onSubmit();
});
}
function displayNumber(numb) {
console.log("the number is", numb);
$("#number-modal").modal("hide");
}
$('[data-number="one"]').click(function () {
showModal("Hello number one!", function () {
displayNumber("one");
});
});
$('[data-number="two"]').click(function () {
showModal("Hello number two!", function () {
displayNumber("two");
});
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button data-number="one" class="btn btn-primary">Number 1</button>
<button data-number="two" class="btn btn-primary">Number 2</button>
<div class="modal fade"
id="number-modal"
tabindex="-1"
data-backdrop="static"
data-keyboard="false"
role="dialog">
<div class="modal-dialog modal-info" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Number Modal</h4>
</div>
<div class="modal-body">
<div id="number-message"></div>
</div>
<div class="modal-footer info-modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" data-click="cancel">Cancel</button>
<button type="button" class="btn btn-primary" data-click="confirm">Confirm</button>
</div>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/js/bootstrap.min.js"></script>
解决方案
您通常不应该在事件处理程序中添加新的事件处理程序,因为事件处理程序堆栈。
记住旧值并不神奇,每次执行此操作时都会运行越来越多的事件处理程序。所以不要。设置一次事件处理程序。
function showModal(body, target) {
$('#number-modal').modal('show').data('target', target);
$('#number-message').html(body);
}
function onSubmit() {
$('#number-modal').modal('hide');
alert('You submitted the form to '+ $('#number-modal').data('target'));
}
$(document).on('click', '[data-number="one"]', function () {
showModal('Hello number one!', 'target 1');
});
$(document).on('click', '[data-number="two"]', function () {
showModal('Hello number two!', 'target 2');
});
$(document).on('click', '[data-click="confirm"]', onSubmit);
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button data-number="one" class="btn btn-primary">Number 1</button>
<button data-number="two" class="btn btn-primary">Number 2</button>
<div class="modal fade"
id="number-modal"
tabindex="-1"
data-backdrop="static"
data-keyboard="false"
role="dialog">
<div class="modal-dialog modal-info" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Number Modal</h4>
</div>
<div class="modal-body">
<div id="number-message"></div>
</div>
<div class="modal-footer info-modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" data-click="cancel">Cancel</button>
<button type="button" class="btn btn-primary" data-click="confirm">Confirm</button>
</div>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/js/bootstrap.min.js"></script>
推荐阅读
- java - Rabbitmq 连接被拒绝,在 linux 服务器上的 docker 容器内运行
- python - Python 函数从另一个函数调用变量。但为什么?
- javascript - 使用现有数组中的匹配键拆分对象
- sql - 带case语句的listagg的正确形式
- git - mac 似乎不是 git 存储库错过了一个斜线
- mongodb - 即使在 mongoDB 中没有使用,如何显示所有可用的数据库列表?
- jenkins - 节点工具位置无法在 Jenkins 中正确保存
- postgresql - 错误 setval:值 0 超出序列“seq”的范围 (1..9223372036854775807)
- sql - 在 LARAVEL 中使用 group by 子句检索列的总和
- c# - 通过 ComVisible DLL 访问 SSL 加密的 WebResource 失败