js節流函數和js防止重復提交的N種方法


應用情景

經典使用情景:js的一些事件,比如:onresize、scroll、mousemove、mousehover等;

還比如:手抖、手誤、服務器沒有響應之前的重復點擊;

這些都是沒有意義的,重復的無效的操作,設置對整個系統的影響還可能是致命的,所以我們要對重復點擊的事件進行相應的處理!

 

節流函數

所謂的節流函數顧名思義,就是某個時刻限制函數的重復調用。

同樣節流函數也是為了解決函數重復提交的問題,而防止重復提交的方法,不止節流函數一種實現。

 

方法匯總

本文整理了我在工作實踐當中,覺的防止js重復提交,比較好用的方法,在這里和大家分享一下。

一、setTimeout + clearTimeout(節流函數)

  本文提供兩種實現方式:普通節流函數和閉包節流函數

二、設定flag/js加鎖

三、通過disable

四、添加浮層比如loading圖層防止多次點擊

 

具體實現

一、setTimeout + clearTimeout(節流函數)

方式一:閉包節流函數(可傳遞多個參數)

/**
 * 閉包節流函數方法(可傳參數)
 * @param Function fn 延時調用函數
 * @param Number delay 延遲多長時間
 * @return Function 延遲執行的方法
 */
var throttle = function (fn, delay) {
    var timer = null;
    return function () {
        var args = arguments; //參數集合
        clearTimeout(timer);
        timer = setTimeout(function () {
            fn.apply(this, args);
        }, delay);
    }
}

/**
 * 要執行的方法
 * @param String name 傳遞的參數
 */
function postFun(name) {
    document.writeln("名字:" + name);
}

//================測試部分 => 【1s重復點擊10次】
var t = throttle(postFun, 1000);
var ejector = setInterval(() => {
    t("tiger");
}, 100);

setTimeout(() => {
    clearInterval(ejector);
}, 1000);

執行結果:

方式二:普通節流函數方法

/**
 * 普通節流函數方法
 * @param Function fn 延時調用函數
 * @param Number delay 延遲多長時間
 */
function throttle(fn, delay) {
    if (fn._id) {
        clearTimeout(fn._id);
    }
    fn._id = window.setTimeout(() => {
        fn();
        fn._id = null;
    }, delay);
}

/**
 * 要執行的方法
 */
function postFun() {
    document.writeln(new Date().getTime());
}

//================測試部分 => 【1s重復點擊10次】
var interval = setInterval(() => {
    throttle(postFun, 1000);
}, 100);

setTimeout(() => {
    clearInterval(interval);
}, 1000);

執行結果:

二、設定flag/js加鎖

var lock = false;
jQuery("#submit").on('click', function () {
    if (lock) {
        return false;
    }
   lock = true; jQuery.post(url, data,
function (response) { //TODO:業務代碼 lock = false; }); });

 

總結

前兩種方式實現起來比較方便,而后兩種實現起來相對比較繁瑣,如果是為了防止事件的多次觸發,建議使用閉包,如果是表單提交,適度使用后兩種比較穩妥。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM