【发布时间】:2021-04-23 19:02:01
【问题描述】:
我刚刚经历了一个场景,我需要自定义一个复选框,因此不应该立即检查,而是,
- 当用户尝试选中复选框时显示确认框。
- 如果用户单击“是”,则选中该复选框。
- 单击“否”后,复选框不会更改并保持未选中状态。
在处理该问题时,我使用 preventDefault 后跟 stopPropagation 来阻止复选框遵循默认行为并有条件地使其选中或取消选中。
在下面的 sn-p 中,复选框首先被选中,但随后它并没有取消选中,因为代码在使用 setTimeout 但没有它时工作正常。以下是样机:
$(document).ready(function() {
$('#chkbx').off('click').on('click', function(e) {
var $checkbox = $(this);
e.preventDefault();
e.stopPropagation();
showConfirmation($checkbox.is(':checked') ? 1 : 0);
});
function showConfirmation(s_checked) {
// Why this if block is making checkbox checked
if (s_checked) {
setTimeout(function() {
$('#chkbx').val(1);
$('#chkbx').prop('checked', true);
}, 3000);
// While a similar code without delay is not working
} else {
$('#chkbx').val(0);
$('#chkbx').prop('checked', false);
}
return true;
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="checkbox" id="chkbx" name="chkbx" />
请帮助我理解,这里出了什么问题,因为代码在不使用 setTimeout 时没有取消选中复选框。
【问题讨论】:
-
请编辑您的问题并包含相关的 HTML。
-
$('#chkbx').off('click').on('click', function(e) {的目的是什么?既然你在document.ready()中有这个,那么如果你只是要立即在同一个元素上调用.on(),就没有任何理由调用.off。 -
添加了 HTML 部分和 JS FIDDLE 链接以及@ScottMarcus
-
我了解
off().on()的用途,但我认为您不了解document.ready()在DOM 准备好后立即触发,此时不会有任何已注册的处理程序,所以在那里使用它是没有用的。如果您在document.ready()触发时确实注册了处理程序,那么只需更改您的代码以便您不需要,因为您似乎不需要任何处理程序。 -
此外,您无需在 3rd 方网站上链接到您的代码。只需将其放入 Stack Snipper(撰写问题时的
{}按钮),它就会在此处运行。
标签: javascript jquery checkbox settimeout preventdefault