Dieses Mal werde ich Ihnen die Implementierung der jQuery+Ajax-Funktion vorstellen. Was sind die Vorsichtsmaßnahmen für die Implementierung der jQuery+Ajax-Funktion?
Implementierungsfunktion
Da die Ajax-Methode in jq das integrierte verzögerte Modul verwendet, handelt es sich um eine Implementierung des Promise-Modus, und wir haben nicht darüber gesprochen hier, also Wir werden diesen Modus nicht verwenden.
Wir definieren nur eine Ajax-Methode, die einfach JSONP-Anfragen abrufen, posten und senden kann~~
var ajax = function () { // 做一些初始化,定义一些私有函数等 return function () { // ajax主体代码 } }() ajax({ url: myUrl, type: 'get', dataType: 'json', timeout: 1000, success: function (data, status) { console.log(data) }, fail: function (err, status) { console.log(err) } })
Die endgültige Funktion unserer Ajax-Methode ist wie oben gezeigt und sehr ähnlich zu jq. Worauf warten wir also noch? Fangen wir an.
Gesamtidee
In diesem Objekt müssen wir einfach einige Attribute definieren Verschiedene Attribute müssen initialisiert werden
//默认请求参数 var _options = { url: null, // 请求连接 type: 'GET', // 请求类型 data: null, // post时请求体 dataType: 'text', // 返回请求的类型,有text/json两种 jsonp: 'callback', // jsonp请求的标志,一般不改动 jsonpCallback: 'jsonpCallback', //jsonp请求的函数名 async: true, // 是否异步 cache: true, // 是否缓存 timeout:null, // 设置请求超时 contentType: 'application/x-www-form-urlencoded', success: null, // 请求成功回调函数 fail: null // 请求失败回调 }
Oben haben wir eine große Liste anforderungsbezogener Daten definiert und dann mit dem Schreiben der Ajax-Hauptfunktion begonnen. Die aktuelle Ajax-Methode sieht so aus:
var ajax = function () { //默认请求参数 var _options = { url: null, type: 'GET', data: null, dataType: 'text', jsonp: 'callback', jsonpCallback: 'jsonpCallback', async: true, cache: true, timeout:null, contentType: 'application/x-www-form-urlencoded', success: null, fail: null } // ... return function (options) { // ... } }()
Wir Sie können darüber nachdenken: Müssen wir, wenn die Ajax-Methode ein Objekt übergibt, die Attribute in initialization_options mit den Attributen überschreiben, die wir für das Objekt festgelegt haben? Dann schreiben wir zunächst eine einfache Vererbung wie folgt:
var ajax = function () { //默认请求参数 var _options = { url: null, type: 'GET', data: null, dataType: 'text', jsonp: 'callback', jsonpCallback: 'jsonpCallback', async: true, cache: true, timeout:null, contentType: 'application/x-www-form-urlencoded', success: null, fail: null } // 内部使用的继承方法 var _extend = function(target,options) { if( typeof target !== 'object' || typeof options !== 'object' ) { return; } var copy ,clone, name; for( name in options ) { if(options.hasOwnProperty(name) && !target.hasOwnProperty(name)) { target[name] = options[name]; } } return target; }; // ... return function (options) { // 没有传参或者没有url,抛出错误 if( !options || !options.url ) { throw('参数错误!'); } // 继承操作 options.type = options.type.toUpperCase(); _extend(options,_options); // ... } }()
Bei dieser Vererbungsmethode erben wir die initialisierten _options an Optionen. Warum? Da sich unser _options-Objekt nicht in der Ajax-Methode befindet, müssen wir es verwenden, können es aber nicht ändern. Wenn wir es ändern, stürzt die Ajax-Methode das nächste Mal ab. Daher setzen wir die Eigenschaften, die das konfigurierte Optionsobjekt nicht hat, auf ihre Anfangswerte.
Sollen wir jetzt eine Anfrage senden? usw! Es scheint, dass die JSONP-Anfrage keine XHR-Anfrage ist. Sie scheint durch Einfügen der Anforderungs-URL als src-Wert des Skript-Tags in den Seitentext implementiert zu werden. Lassen Sie uns übrigens zuerst die JSONP-Anfrage verarbeiten und dann beginnen Erstellen des Codes für die XHR-Anfrage.
var ajax = function () { //默认请求参数 var _options = { url: null, type: 'GET', data: null, dataType: 'text', jsonp: 'callback', jsonpCallback: 'jsonpCallback', async: true, cache: true, timeout:null, contentType: 'application/x-www-form-urlencoded', success: null, fail: null } // 内部使用的继承方法 var _extend = function(target,options) { if( typeof target !== 'object' || typeof options !== 'object' ) { return; } var copy ,clone, name; for( name in options ) { if(options.hasOwnProperty(name) && !target.hasOwnProperty(name)) { target[name] = options[name]; } } return target; }; // jsonp处理函数 function _sendJsonpRequest(url,callbackName,succCallback) { var script = document.createElement('script'); script.type="text/javascript"; script.src=url; document.body.appendChild(script); // 如果用户自己定义了回调函数,就用自己定义的,否则,调用success函数 window[callbackName] = window[callbackName] || succCallback; } // ... return function (options) { // 没有传参或者没有url,抛出错误 if( !options || !options.url ) { throw('参数错误!'); } // 继承操作 options.type = options.type.toUpperCase(); _extend(options,_options); /*jsonp部分,直接返回*/ if( options.dataType === 'jsonp' ) { var jsonpUrl = options.url.indexOf('?') > -1 ? options.url: options.url + '?' + options.jsonp+ '=' + options.jsonpCallback; return _sendJsonpRequest(jsonpUrl,options.jsonpCallback,options.success); } // ... } }()
Wir haben eine _sendJsonpRequest-Funktion definiert. Der erste ist jsonpUrl, der zweite ist der Rückruffunktionsname von jsonp und der dritte ist die Erfolgsrückruffunktion ein Skriptelement mit src als jsonpUrl und fügen Sie es in den Körper ein. Bestimmen Sie gleichzeitig die Rückruffunktion (wenn wir die jsonpCallback-Funktion definieren, rufen Sie sie auf, wenn nicht, rufen Sie den Erfolgsrückruf auf. Im Allgemeinen definieren wir nicht die globale jsonpCallback-Funktion und übergeben Sie einen Erfolgsrückruf, um die JSONP-Anfrage abzuschließen.
Okay, nach der Verarbeitung der JSONP-Anfrage beginnen wir mit der Verarbeitung der XHR-Anfrage.
var ajax = function () { //默认请求参数 var _options = { url: null, type: 'GET', data: null, dataType: 'text', jsonp: 'callback', jsonpCallback: 'jsonpCallback', async: true, cache: true, timeout:null, contentType: 'application/x-www-form-urlencoded', success: null, fail: null } // 内部使用的继承方法 var _extend = function(target,options) { if( typeof target !== 'object' || typeof options !== 'object' ) { return; } var copy ,clone, name; for( name in options ) { if(options.hasOwnProperty(name) && !target.hasOwnProperty(name)) { target[name] = options[name]; } } return target; }; // jsonp处理函数 function _sendJsonpRequest(url,callbackName,succCallback) { var script = document.createElement('script'); script.type="text/javascript"; script.src=url; document.body.appendChild(script); // 如果用户自己定义了回调函数,就用自己定义的,否则,调用success函数 window[callbackName] = window[callbackName] || succCallback; } // json转化为字符串 var _param = function(data) { var str = ''; if( !data || _empty(data)) { return str; } for(var key in data) { str += key + '='+ data[key]+'&' } str = str.slice(0,-1); return str; } //判断对象是否为空 var _empty = function(obj) { for(var key in obj) { return false; } return true; } // ... return function (options) { // 没有传参或者没有url,抛出错误 if( !options || !options.url ) { throw('参数错误!'); } // 继承操作 options.type = options.type.toUpperCase(); _extend(options,_options); /*jsonp部分,直接返回*/ if( options.dataType === 'jsonp' ) { var jsonpUrl = options.url.indexOf('?') > -1 ? options.url: options.url + '?' + options.jsonp+ '=' + options.jsonpCallback; return _sendJsonpRequest(jsonpUrl,options.jsonpCallback,options.success); } //XMLHttpRequest传参无影响 var xhr = new (window.XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP'); // get搜索字符串 var search = ''; // 将data序列化 var param= _param(options.data) if( options.type === 'GET' ) { search = (options.url.indexOf('?') > -1 ? '&' : '?') + param; if(!options.cache) { search += '&radom='+Math.random(); } param = null; } // ... } }()
Erstens ist es mit dem IE kompatibel, xhr-Objekte zu erstellen.KonstruktorDie Übergabe von Parametern hat keine Auswirkung: search und param. Ersteres wird verwendet Für die Abfrage der Get-Anfrage wird letztere für den Sendeinhalt der Post-Anfrage verwendet. Wir haben eine _param-Methode definiert, um das Objekt in den Sendemethoden-Parametermodus zu konvertieren zwischen get und post Zuweisungsarbeit von Suche und Parameter. Als nächstes können wir eine Anfrage senden, um die spannendsten Inhalte zu schreiben.
Der endgültige Code lautet wie folgt
; var ajax = function () { //默认请求参数 var _options = { url: null, type: 'GET', data: null, dataType: 'text', jsonp: 'callback', jsonpCallback: 'jsonpCallback', async: true, cache: true, timeout:null, contentType: 'application/x-www-form-urlencoded', success: null, fail: null } // json转化为字符串 var _param = function(data) { var str = ''; if( !data || _empty(data)) { return str; } for(var key in data) { str += key + '='+ data[key]+'&' } str = str.slice(0,-1); return str; } //判断对象是否为空 var _empty = function(obj) { for(var key in obj) { return false; } return true; } var _extend = function(target,options) { if( typeof target !== 'object' || typeof options !== 'object' ) { return; } var copy ,clone, name; for( name in options ) { if(options.hasOwnProperty(name) && !target.hasOwnProperty(name)) { target[name] = options[name]; } } return target; }; // 自定义text转化json格式 var parseJSON = function(text) { if(typeof text !== 'string') { return; } if( JSON && JSON.parse ) { return JSON.parse(text); } return (new Function('return '+text))(); } // jsonp处理函数 function _sendJsonpRequest(url,callbackName,succCallback) { var script = document.createElement('script'); script.type="text/javascript"; script.src=url; document.body.appendChild(script); // 如果用户自己定义了回调函数,就用自己定义的,否则,调用success函数 window[callbackName] = window[callbackName] || succCallback; } return function (options) { // 没有传参或者没有url,抛出错误 if( !options || !options.url ) { throw('参数错误!'); } // 继承操作 options.type = options.type.toUpperCase(); _extend(options,_options); /*jsonp部分,直接返回*/ if( options.dataType === 'jsonp' ) { var jsonpUrl = options.url.indexOf('?') > -1 ? options.url: options.url + '?' + options.jsonp+ '=' + options.jsonpCallback; _sendJsonpRequest(jsonpUrl,options.jsonpCallback,options.success); return; } //XMLHttpRequest传参无影响 var xhr = new (window.XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP'); // get搜索字符串 var search = ''; // 将data序列化 var param= _param(options.data) if( options.type === 'GET' ) { search = (options.url.indexOf('?') > -1 ? '&' : '?') + param; if(!options.cache) { search += '&radom='+Math.random(); } param = null; } xhr.open( options.type, options.url + search, options.async ); xhr.onreadystatechange = function() { if( xhr.readyState == 4 ) { if( xhr.status >= 200 && xhr.status < 300 || xhr.status == 304 ) { var text = xhr.responseText; // json格式转换 if(options.dataType == 'json') { text = parseJSON(text) } if( typeof options.success === 'function') { options.success(text,xhr.status) } }else { if(typeof options.fail === 'function') { options.fail('获取失败', 500) } } } } xhr.setRequestHeader('content-type',options.contentType); // get请求时param时null xhr.send(param); // 如果设置了超时,就定义 if(typeof options.timeout === 'number') { // ie9+ if( xhr.timeout ) { xhr.timeout = options.timeout; }else { setTimeout(function() { xhr.abort(); },options.timeout) } } } }()
Wie Sie sehen können, sind wir mit dem xhr-Code sehr vertraut. Hier müssen wir eine Methode parseJSON schreiben, die den zurückgegebenen String analysiert, um einen zu bilden JSON-Formatobjekt, ähnlich der jq parseJSON-Methode in, wie oben gezeigt.
Wir müssen auch den Timeout-Code festlegen. Wenn der Anforderungs-Timeout festgelegt ist, definieren wir ihn wie oben.
Hinweis: Im obigen Code bestimmt die Zeile zum Festlegen des Anforderungsheaders aus Gründen der Faulheit nicht, ob er sich unter einer Post-Anfrage befindet. Sie können ihn selbst festlegen.
Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!
Empfohlene Lektüre:
jQuery Ajax Analysis Collection
Native js implementiert die Ajax-Anfragemethode
Das obige ist der detaillierte Inhalt vonImplementierung der jQuery+Ajax-Funktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!