ホームページ > 記事 > ウェブフロントエンド > jQuery+ajax関数の実装
今回は、jQuery+ajax 関数の実装について説明します。jQuery+ajax 関数の実装に関する 注意事項 は何ですか?実際のケースを見てみましょう。
実装関数
jqのajaxメソッドは組み込みのdeferredモジュールを使用するため、Promiseモードの実装であり、ここでは触れていないため、このモードは使用しません。 ここでは単に get、post、jsonp リクエストを実行できる ajax メソッドのみを定義します~~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) } })ajax メソッドの最終的な関数は上に示したとおりで、jq と非常によく似ています。それでは、何を待っているのでしょうか、始めましょう。
全体的なアイデア
私たちのajaxメソッドはオブジェクトを渡す必要があります。このオブジェクトでは、必要ないくつかの属性を定義でき、さまざまな属性を初期化する必要があります//默认请求参数 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 // 请求失败回调 }上記で、大規模な一連のリクエストを定義しました。データを取得したら、ajax main 関数を書き始めます。現在の ajax メソッドは次のようなものです
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) { // ... } }()考えてみると、ajax メソッドはオブジェクトを渡しますが、このオブジェクトに属性を設定する必要があるのでしょうか?上では、initialization_options は必ず必要です。次に、次のように、最初に単純な継承を作成しましょう:
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); // ... } }()この継承メソッドでは、初期化された _options を options に継承します。 _options オブジェクトは ajax メソッド内にないため、これを使用する必要がありますが、変更すると、次回 ajax メソッドがクラッシュします。したがって、設定されたオプション オブジェクトにないプロパティを初期値に設定します。 さて、リクエストを送りましょうか?等! jsonpリクエストはxhrリクエストではないようで、scriptタグのsrc値としてリクエストURLをページ本文に挿入することで実装されるようです。 xhr リクエストのコードを構築します。
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); } // ... } }()この関数は 3 つのパラメーターを受け取ります。1 つ目は jsonpUrl、3 つ目は成功コールバック関数です。この関数に src を作成します。 jsonpUrl の要素を body に追加し、同時にコールバック関数を決定します (jsonpCallback 関数を定義している場合はそれを呼び出し、そうでない場合は成功コールバックを呼び出します。通常、グローバルな jsonpCallback 関数を定義して成功を渡すことはありません) jsonp リクエストを完了するためのコールバック)。 それでは、jsonp リクエストを処理した後、xhr リクエストの処理を開始します。
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; } // ... } }()まず、XHR オブジェクトの作成には IE と互換性があります。パラメータを渡しても効果はありません。次に、search と param の 2 つの補助変数を定義します。前者は get リクエストのクエリ文字列に使用されます。後者は post に使用されます。リクエストの送信コンテンツについては、オブジェクトを送信メソッド パラメータのモードに変換する _param メソッドを定義しました。ご覧のとおり、以下では、適切な検索とパラメータの割り当てを行っています。取得して投稿します。次に、最もエキサイティングなコンテンツを作成するリクエストを送信できます。
; 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) } } } }()ご覧のとおり、私たちは xhr コードに精通しています。ここでは、parseJSON メソッドと同様に、返された文字列を解析して json 形式のオブジェクトを形成するメソッド parseJSON を記述する必要があります。上記のように jq で。 リクエストタイムアウトが設定されている場合は、タイムアウトコードも設定する必要があります。それを上記のように定義します。 注: 上記のコードでは、遅延のため、リクエストヘッダーを設定する行は、それがポストリクエストの下にあるかどうかを判断しません。これは自分で設定できます~~~。 この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。 推奨書籍:
jQuery Ajax 分析完全コレクション
ネイティブ js が Ajax リクエスト メソッドを実装する
以上がjQuery+ajax関数の実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。