JavaScript debounce防止用户重复提交

例。

页面有一按钮,点击一次可以触发一个 Ajax 请求。如果不做特殊处理,那么,用户快速点击时就会触发大量 Ajax 请求,给服务器带来不必要的负担。

处理方法有多种:

点击后禁用按钮

 代码如下 复制代码

//登录
function login(usernameId,pwdId,codeId){
    suspendBtn(btnSubmit);
   
    $.ajax({
    url: '/admin/WebService1.asmx/Login',
    type: 'POST',
    dataType:"xml",
    contentType :"application/x-www-form-urlencoded;charset=utf-8",
    data:{username:username.value,strPwd:pwd.value},
    success: function(msg){
        if(msg.text=="false"){
            alert("请填写正确的用户名密码!");
            username.select();
        }else{
            openWindow("default.aspx",true);
        }
    },
    error: function(x, e) {
        alert(x.responseText);
    }});
   
    resumeBtn(btnSubmit);
}

//挂起按钮
function suspendBtn(btn){
    btn.disabled="disabled";
    btn.value="正在登录";
}

//恢复按钮
function resumeBtn(btn){
    btn.disabled="";
    btn.value="提交";
}

这是比较简单粗暴的方法,在用户第一次触发 click 事件后即禁用该按钮 – 设置 disabled 属性为 true。在处理完 Ajax 请求后,再根据情况决定是否启用该按钮。

Debounce

维基上 debounce 译成去除抖?印N颐强梢园延没а杆俚慊髟斐傻拇罅渴录?シ⒖闯伞感藕诺亩抖? – 这时触发事件处理器的信号处于不稳定状态。

debounce 方法的原理是,第一个事件触发时,对其绑定的事件函数做一定的延迟执行(setTimeout),比如100毫秒,如果100毫秒内没有再触发事件,则我们可以认为信息稳定,事件处理器将在预计的100毫秒【当然,这个时间并不准确,有兴趣可以看 JavaScript 异步一篇的说明】,但如果100毫秒内还在触发同一事件,则上一个延迟被清除(clearTimeout),新的延迟(setTimeout)替换进来。

于是,如果用户一直点击按钮并且两次点击的时间间隔小于100毫秒时,click 事件被持续触发,新的延迟不断替入旧的延迟,结果是事件处理器函数得不到执行。

举一个点击按钮提交 Ajax 请求的例子1:

 代码如下 复制代码

$('#fav').on('click',function () {
    var timer = null;
    return function () {
        clearTimeout(timer);/每次执行时清除上一个延迟事件
        timer = setTimeout(function () {//设定新延迟事件
            $.ajax({...});
        }, 100);
    }
});

这个方法有一个明显的缺陷,就是用户正常点击时,事件的处理也被无例外地推迟100毫秒。
throttle

throttle的定义是:

    a device controlling the flow of fuel or power to an engine.

在这里,可以简单理解成一个控制函数发生频率的机制2。

与 debounce 不同的是,throttle 方法不会延迟第一次事件的处理。它即时处理第一次事件,并记录时间,之后再发生事件,它再计算一个时间值,这个时间值表示,离第一次事件发生过去了多久,如果这个时间值小于设定的时间阀(threshold),则利用 setTimeout 推迟事件处理,一旦到达时间阀,则即时触发事件处理。

这样,throttle 就控制住密集事件可触发事件处理器的频率,比如每200秒(threshold)仅触发一个事件函数。具体应用请见扩展阅读3中 scroll 与 resize 事件的示例。

时间: 2024-11-09 03:55:45

JavaScript debounce防止用户重复提交的相关文章

注册或者点击按钮时,怎么防止用户重复提交数据

 这篇文章主要是对注册或者点击按钮时,怎么防止用户重复提交数据进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 asp.net实现点击按钮后设按钮不可用并提交  代码如下: <asp:Button ID="Button1" runat="server" Text="123456" OnClientClick="this.disabled=true;this.form.submit(); "  UseSubmitB

PHP防止用户重复提交表单

我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦. 那么如何规避这中重复提交表单的现象出现呢?我们可以从很多方面入手: 首先从前端做限制.前端JavaScript在按钮被点击一次后禁用,即disabled,这个方法简单的防止了多次点击提交按钮,但是缺点是如果用户禁用了javascript脚本则失效. 第二,我们可以在提交后做redirect页面重定向,即提交后跳

php防止用户重复提交表单_php技巧

我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦. 效果图:   那么如何规避这中重复提交表单的现象出现呢?我们可以从很多方面入手: 首先从前端做限制.前端JavaScript在按钮被点击一次后禁用,即disabled,这个方法简单的防止了多次点击提交按钮,但是缺点是如果用户禁用了javascript脚本则失效. 第二,我们可以在提交后做redirect页面重定

防止用户重复提交数据方法总结

php cookie处理方法 如果数据通过了上边的两次验证,说明数据是合法有效的数据.这时候我们把提交的数据串接为一个字符串,并用MD5加密后得到一个MD5的值,接着我们把这个值通过Cookie放进客户端,当用户下一次提交表单的时候我们就重新操作这一步,并且读出Cookie中的MD5值,进行比较,如果相同就可断定用户提交两次提交的表单是相同的,否则替换这个Cookie!  代码如下 复制代码 <?php $value = $_COOKIE["value"]; //读取上一次设置的

通过JS在客户端限止用户重复提交的代码

程序介绍:1.方法一:hiddenForm 隐藏表单法: 查看函数 hiddenForm2.方法二:disButtons 禁用按钮法: 查看函数 disButtons disButtons23.本程序为客户端javascript程序限制多次提交,冰河原创首发蓝色理想,欢迎大家转载,但请保留本人信息,谢谢4.源码发布在我的手机主题站: http://www.qumiao.com/javascript/disRepSubmit.rar (本人所有原创程序均打包发在此)5.作者邮箱及QQ: bingh

如何防止用户重复提交数据

数据|重复|重复提交 这篇文章从语法上看,原作者应该是从什么地方翻译过来的. 简单的解决方案:最简单的方式就是当用户提交之后,在你的服务器端控件的代码中使用Response.Redirect("selfPage")语句.但是大多的数包括我都不使用这种方法. 多次提交:请注意:这篇文章并不是有关如何防止在一个页面中多次提交.这篇文章是教你在提交了请求之后如何防止页面进行刷新.情况是这样的,当用户提交了按钮之后,最终用户就不能再点击提交按钮了.但是这样最终用户仍然可以通过点击浏览器的刷新按

一个JavaScript防止表单重复提交的实例_javascript技巧

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>防止重复表单提交</title> <style> #refresh{ display: none; width:200px; height:20px; background

AJAX避免用户重复提交请求实现方案_AJAX相关

在使用AJAX(jQuery)异步请求数据时,为了避免因某些原因用户同时多次点击按钮,提交重复的请求,我们需要禁用请求提交按钮. 重点:jQuery的 attr 和 removeAttr 两个函数,主要是元素button的disabled属性. Demo: 复制代码 代码如下: <body> <a class="disabled">Button disabeld</a>    <a class="abled">Butt

AJAX避免用户重复提交请求实现方案

在使用AJAX(jQuery)异步请求数据时,为了避免因某些原因用户同时多次点击按钮,提交重复的请求,我们需要禁用请求提交按钮. 重点:jQuery的 attr 和 removeAttr 两个函数,主要是元素button的disabled属性. Demo: 复制代码 代码如下: <body> <a class="disabled">Button disabeld</a>    <a class="abled">Butt