1. 程式人生 > 其它 >JS 原生Ajax

JS 原生Ajax

function jsAjax(params) {
    params = params || {};
    params.data = params.data || {};
    // 判斷是ajax請求還是jsonp請求
    var json = params.jsonp ? jsonp(params) : json(params);
    // ajax請求 
    function json(params) {
        // 請求方式,預設是GET
        params.type = (params.type || 'GET').toUpperCase();
        
// 避免有特殊字元,必須格式化傳輸資料 params.data = formatParams(params.data); var xhr = null; // 例項化XMLHttpRequest物件 if (XMLHttpRequest) { xhr = new XMLHttpRequest(); } else { // IE6及其以下版本 xhr = new ActiveXObjcet('Microsoft.XMLHTTP'); };
// 監聽事件,只要 readyState 的值變化,就會呼叫 readystatechange 事件 xhr.onreadystatechange = function() { // readyState屬性表示請求/響應過程的當前活動階段,4為完成,已經接收到全部響應資料 if (xhr.readyState == 4) { var status = xhr.status; // status:響應的HTTP狀態碼,以2開頭的都是成功 if (status >= 200 && status < 300) {
var response = ''; // 判斷接受資料的內容型別 var type = xhr.getResponseHeader('Content-type'); if (type.indexOf('xml') !== -1 && xhr.responseXML) { response = xhr.responseXML; //Document物件響應 } else if (type === 'application/json') { response = JSON.parse(xhr.responseText); //JSON響應 } else { response = xhr.responseText; //字串響應 }; // 成功回撥函式 params.success && params.success(response); } else { params.error && params.error(status); } params.complete && params.complete(status); }; }; // 連線和傳輸資料 if (params.type == 'GET') { // 三個引數:請求方式、請求地址(get方式時,傳輸資料是加在地址後的)、是否非同步請求(同步請求的情況極少); xhr.open(params.type, params.url + '?' + params.data, params.async); xhr.send(null); } else { xhr.open(params.type, params.url, true); //必須,設定提交時的內容型別 xhr.setRequestHeader('Content-Type', params.contentType); // 傳輸資料 xhr.send(params.data); } } //格式化引數 function formatParams(data) { var arr = []; for (var name in data) { // encodeURIComponent() :用於對 URI 中的某一部分進行編碼 arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name])); }; // 新增一個隨機數引數,防止快取 arr.push('v=' + random()); return arr.join('&'); } // 獲取隨機數 function random() { return Math.floor(Math.random() * 10000 + 500); } }