jQuery是一個(gè)非常流行的JavaScript庫,主要用于處理DOM元素,事件,動畫效果等。另外,jQuery也提供了一個(gè)強(qiáng)大的AJAX方法,用于異步加載數(shù)據(jù),更新頁面內(nèi)容。其中,$.ajax()方法是最基本的AJAX方法,支持GET,POST,PUT等請求方式。下面我們來看一下$.ajax()方法的源碼實(shí)現(xiàn)。
jQuery.ajax = function(options) { //合并參數(shù) options = jQuery.extend({}, options || {}); var deferred = jQuery.Deferred(); var urlAnchor; //解析URL urlAnchor = document.createElement('a'); urlAnchor.href = options.url; //默認(rèn)選項(xiàng) options = jQuery.extend({ url: urlAnchor.href, type: 'GET', dataType: 'json', processData: true, beforeSend: function(xhr, settings) {}, success: function(data, textStatus, xhr) {}, error: function(xhr, textStatus, errorThrown) {}, complete: function(xhr, textStatus) {}, context: options, }, options); //處理data參數(shù) if (options.data && options.processData && typeof options.data !== 'string') { options.data = jQuery.param(options.data, options.traditional); } //創(chuàng)建xhr對象 var xhr = options.xhr(); xhr.open(options.type, options.url, options.async, options.username, options.password); try { //設(shè)置header if (options.contentType) { xhr.setRequestHeader('Content-Type', options.contentType); } xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); //設(shè)置beforeSend回調(diào)函數(shù) if (options.beforeSend.call(options.context, xhr, options) === false) { //取消請求 xhr.abort(); deferred.rejectWith(options.context, ['abort', xhr, options]); return xhr; } //監(jiān)聽xhr事件 xhr.onreadystatechange = function() { if (xhr.readyState === 4) { //請求完成 xhr.onreadystatechange = jQuery.noop; var isSuccess = xhr.status >= 200 && xhr.status< 300 || xhr.status === 304; if (isSuccess) { //處理成功的回調(diào)函數(shù) deferred.resolveWith(options.context, [xhr.response, xhr.status, xhr]); } else { //處理失敗的回調(diào)函數(shù) deferred.rejectWith(options.context, [xhr, 'error', xhr.statusText]); } //處理complete回調(diào)函數(shù) options.complete.call(options.context, xhr, isSuccess ? 'success' : 'error'); } }; //發(fā)送請求 xhr.send(options.data); } catch (e) { //處理請求異常 deferred.rejectWith(options.context, [e, xhr, options]); } //返回promise對象 return deferred.promise(); };
上面是$.ajax()方法的源碼實(shí)現(xiàn),通過解析URL,合并參數(shù),創(chuàng)建xhr對象,監(jiān)聽事件等步驟,實(shí)現(xiàn)了一個(gè)基本的AJAX請求。此外,源碼中還包含了一些默認(rèn)選項(xiàng)和回調(diào)函數(shù),可以通過options參數(shù)進(jìn)行配置。這個(gè)方法已經(jīng)封裝的比較完善,一般情況下我們只需要傳入url和data等必要參數(shù)即可,具體的錯(cuò)誤處理和數(shù)據(jù)處理在success和error回調(diào)函數(shù)中進(jìn)行。這就是jQuery中的AJAX實(shí)現(xiàn)方式。