Ajax加載數據中的loading效果

如題,不難理解,故很少作介紹,直切主題。javascript

在html任意位置放置loading圖標:css

<div id="cisLoading">
	<img src="/srp/assets/plugins/jstree/throbber.gif" style="width:24px;height:24px" />
</div>

css樣式文件,確保loading圖標不論放大縮小窗口,都一直處於窗口正中心:html

#cisLoading {
	position: fixed;
	left: 50%;
	top: 50%;
	z-index: 1000;
	display: none;
}

js控制ajax在開始加載數據時,顯示loading;加載完數據或ajax出錯結束加載,隱藏loading:java

// 當前併發ajax請求的次數
g.parallel_count = 0;
/*
* url:要訪問的遠程地址
* data:訪問遠程地址時的參數
* callback:回調函數
* timeout:訪問遠程地址超時時間
* err_message:發生錯誤時的提示信息
* child_parallel_count:一個頁面同時有多個ajax,此處傳該頁面上的ajax請求的總次數
*/
g.ajax = function (url, data, callback, timeout, err_message, child_parallel_count) {

    if(!data)
        data = {};

    if(!timeout){
        timeout = g.timeout;
    }

    $.ajax({
        url: url,
        async: true,
        type: 'POST',
        timeout: timeout,
        data: data,
        //headers:{rtype:"query"},//能夠附加頭信息
        beforeSend: function (XMLHttpRequest) {
                // 過濾某種條件下才控制loading效果
        	if (url == "/srp/data") {
        		$("#cisLoading").show();
        	}
        },
        success: function (text, status) {
            try {
            	if (text == "533") {
            		$("#cisLoading").hide();
            		alert("Cookie可能已丟失,本次請求無效,請退出從新登陸!");
            	} else if (text == "534") {
            		$("#cisLoading").hide();
            		alert("可能長時間未操做,用戶信息已過時,請退出從新登陸!");
            	}
                // var o = JSON.parse(text);
                // try{
                //     if(typeof o.message === "string")
                //         o.message = JSON.parse(o.message);
                // }catch (e){
                //     console.warn("o.message to json faild");
                // }
            	else if (typeof callback === "function") {
            		callback(text);
            	}
            } catch (e) {
                console.debug(text);
                console.error(e);
                // alert(err_message);
            }
        },
        error: function (XMLHttpRequest, status, errorThrown) {
        	if (url == "/srp/data") {
        		// 若未傳child_parallel_count,表明能夠直接hide
        		// 或者傳了,但parallel_count已經加到child_parallel_count
        		if (child_parallel_count == undefined || ++g.parallel_count === child_parallel_count) {
        			$("#cisLoading").hide();
        			g.parallel_count = 0;
        		}
        	}
        	console.error(err_message);
        },
        complete:function (XMLHttpRequest, status) {
        	if (url == "/srp/data") {
        		// 若未傳child_parallel_count,表明能夠直接hide
        		// 或者傳了,但parallel_count已經加到child_parallel_count
        		if (child_parallel_count == undefined || ++g.parallel_count === child_parallel_count) {
        			$("#cisLoading").hide();
        			g.parallel_count = 0;
        		}
        	}
        }
    });
};

以上實現,經過全局變量g.parallel_count和ajax最後一個入參child_parallel_count,對一個頁面同時併發請求多個ajax的狀況下,去控制loading正確的顯示隱藏機制,具體請求方式以下:jquery

p0.fetchData = function () {
	var data1 = {"res": "20+21+22+23+24+25+37+38","paramStr": "[{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null}]"};
	handleDateValue(data1);
	g.ajax("/srp/data", data1, function (jsonStr) {
		setValue(JSON.parse(jsonStr));
	}, null, null, 3);

	var data2 = {"res": "34+36+35+30+31+32+33+27+28+29","paramStr": "[{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"bizdate\": null},{\"bizdate\": null},{\"bizdate\": null}]"};
	handleDateValue(data2);
	g.ajax("/srp/data", data2, function (jsonStr) {
		setValue(JSON.parse(jsonStr));
		var chartScript = "<script src='assets/pages/jquery.dashboard.js'></"+"script>";
		$("#dashboard").append(chartScript);
		showKnob();
	}, null, null, 3);

	var data3 = {"res": "43+44+45+46","paramStr": "[{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null},{\"e_branchid\": null,\"bizdate\": null}]"};
	handleDateValue(data3);
	g.ajax("/srp/data", data3, function (jsonStr) {
		setValue(JSON.parse(jsonStr));
	}, null, null, 3);
};

此頁面須要3個ajax同時請求,當最後一個加載結束,不論成功失敗,當即隱藏loading,則需設置child_parallel_count=3便可。ajax

相關文章
相關標籤/搜索