How to prevent calling of en event handler twice on fast clicks?(如何防止在快速点击时两次调用 en 事件处理程序?)
问题描述
有一个按钮,当用户点击按钮时,一些数据会保存到后端.问题是当用户快速点击按钮时,事件处理程序会被多次执行.
There is a button and when user clicks on button, some data is saved to back-end. Issue is when user clicks on button very quickly, event handler is getting executed multiple times.
这是代码
var x = 1;
$('#button').click(function() {
// Do something
// Save some data on network
x++;
console.log(x);
});
我希望当用户单击按钮一次时执行此处理程序.即使在双击或三次单击的情况下,也应该只执行一次.我只是想避免快速点击,这个处理程序当然可以再次执行
我有多种解决方案,比如
I have multiple solutions in my mind like
定义一个像
IS_BUTTON_HANDLER_WORKING = false
这样的全局变量,当你进入处理程序时,将其设置为 true,最后再次设置为 false.并检查是否为真,只需从函数返回.
Define a global variable like
IS_BUTTON_HANDLER_WORKING = false
and when you enter the handler set it to true and in the end set it to false again. And check if it is true just return from the function.
在开始时分离处理程序并在最后重新附加.
Detach the handler in the beginning and reattach in the end.
假设您的应用程序中有 25 个按钮.实现这一点的最佳方法应该是什么.
Consider you have 25 buttons in your application. What should be the best approach to implement this.
看看这个小提琴
$('#button').click(function() {
$(this).attr('disabled', true);
// Do something
// Save some data on network
$(this).removeAttr('disabled');
});
使用它,我们可以确定只有在之前的执行完全完成后,我们的下一个处理程序才会被执行.
推荐答案
David Walsh 有一个很棒的 解决方案一个>.
David Walsh has a great solution.
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
这篇关于如何防止在快速点击时两次调用 en 事件处理程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何防止在快速点击时两次调用 en 事件处理程序?
基础教程推荐
- Vue 3 – <过渡>渲染不能动画的非元素根节点 2022-01-01
- Chart.js 在线性图表上拖动点 2022-01-01
- html表格如何通过更改悬停边框来突出显示列? 2022-01-01
- Electron 将 Node.js 和 Chromium 上下文结合起来意味着 2022-01-01
- 如何使用TypeScrip将固定承诺数组中的项设置为可选 2022-01-01
- 用于 Twitter 小部件宽度的 HTML/CSS 2022-01-01
- 我可以在浏览器中与Babel一起使用ES模块,而不捆绑我的代码吗? 2022-01-01
- 自定义 XMLHttpRequest.prototype.open 2022-01-01
- 如何使用JIT在顺风css中使用布局变体? 2022-01-01
- 直接将值设置为滑块 2022-01-01