Jquery 防止Ajax重複提交權威解決方案

/**
 * jquery ajax請求過濾,防止ajax請求重複發送,對ajax發送錯誤時進行統一處理
 */
$(function(){
    var pendingRequests = {};
    // 全部ajax請求的通用前置filter
    $.ajaxPrefilter(function( options, originalOptions, jqXHR ) {
        var key = generatePendingRequestKey(options);

        //請求是否已經存在
        if(!pendingRequests[key]){
            storePendingRequest(key,jqXHR);
        }else{
            //若是ajax請求已經存在,下一次相同的請求則取消,防止重複請求
            jqXHR.abort();
        }

        //ajax請求完成時,從臨時對象中清除請求對應的數據
        var complete = options.complete;
        options.complete = function(jqXHR, textStatus) {
            //延時1000毫秒刪除請求信息,表示同Key值請求不能在此時間段內重複提交
            setTimeout(function(){
                delete pendingRequests[jqXHR.pendingRequestKey];
            },1000);

            if ($.isFunction(complete)) {
                complete.apply(this, arguments);
            }
        };

        //統一的錯誤處理
        var error = options.error;
        options.error = function(jqXHR, textStatus) {
            errorHandler(jqXHR, textStatus);
            if ($.isFunction(error)) {
                error.apply(this, arguments);
            }
        };
    });

    /**
     * 當ajax請求發生錯誤時,統一進行攔截處理的方法
     */
    function errorHandler(jqXHR, textStatus){
        switch (jqXHR.status){
            case(500):
                internalError(jqXHR);
                break;
            case(403):
                accessDenied(jqXHR);
                break;
            case(408):
                timeoutError(jqXHR);
                break;
            case(404):
                pageNotFound(jqXHR);
                break;
            default:
                //otherError(jqXHR, textStatus);
        }
    }

    function pageNotFound(jqXHR){
        Component.warningMessageBox({
            content:"請求訪問的地址或內容不存在!"
        });
    }

    function accessDenied(jqXHR){
        Component.warningMessageBox({
            content:"你無權進行此操做或頁面訪問!"
        });
    }

    function internalError(jqXHR){
        Component.warningMessageBox({
            content:"服務器存在錯誤,未能正確處理你的請求!"
        });
    }

    function timeoutError(jqXHR){
        window.location.href=contextPath + "/j_spring_security_logout";
    }

    function otherError(jqXHR, textStatus){
        Component.warningMessageBox({
            content:"未知錯誤,錯誤代碼:" + textStatus
        });
    }

    /**
     * 將ajax請求存儲到臨時對象中,用於根據key判斷請求是否已經存在
     */
    function storePendingRequest(key, jqXHR){
        pendingRequests[key] = jqXHR;
        jqXHR.pendingRequestKey = key;
    }

    /**
     * 根據ajax請求參數構建一個臨時存儲key,此處簡單的使用url做爲key,
     * 不考慮爲解決請求類型爲get時相同路徑引發的緩存問題,採用隨機碼構建URL的狀況
     */
    function generatePendingRequestKey(options){
        return options.url;
    }
});
相關文章
相關標籤/搜索