jQueryソース分析の$.get/$.post/serialize/serializeArrayメソッドの詳細

7584 ワード

get/postソースコードは以下の通りです.
jQuery.each( [ "get", "post" ], function( i, method ) {
	//           ,          !
	jQuery[ method ] = function( url, data, callback, type ) {
		// shift arguments if data argument was omitted
		if ( jQuery.isFunction( data ) ) {
			type = type || callback;
			callback = data;
			data = undefined;
		}
        //  get  type  get。  post  type  post!
		return jQuery.ajax({
			url: url,
			type: method,
			dataType: type,
			data: data,
			success: callback
		});
	};
});
note:
(1)get/postメソッドの下位レベルで呼び出されるのはajaxメソッドである.入力された4番目のパラメータは、dataType、すなわちサーバ側から取得したデータ型を指定するために使用されます.
(2)Getメソッドはデータ量の大きいデータを転送するのに適していないとともに,要求された履歴情報もブラウザのキャッシュに保存され,一定のリスクがあるがpostには存在しない!ではgetリクエストはなぜajaxリクエストでキャッシュされるのか:(ajaxメソッドのコードクリップを参照)
           var rnoContent = /^(?:GET|HEAD)$/
           s.hasContent = !rnoContent.test( s.type );
		// Save the URL in case we're toying with the If-Modified-Since
		// and/or If-None-Match header later on
		cacheURL = s.url;
                //   get/head  ,     if  ,     get/post       cache,  s.cache===false  !      !
               //       URL          ,     ,  GET     !  post            !
		// More options handling for requests with no content
		if ( !s.hasContent ) {//post        ,      !
			// If data is available, append data to url
			if ( s.data ) {
				cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
				// #9682: remove data so that it's not used in an eventual retry
				delete s.data;
			}
			// Add anti-cache in url if needed $.post/$.get     cache
			if ( s.cache === false ) {
				s.url = rts.test( cacheURL ) ?
					// If there is already a '_' parameter, set its value
					cacheURL.replace( rts, "$1_=" + nonce++ ) :
					// Otherwise add one to the end
					cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
			}
		}

typeStringタイプ
既定値:GET.要求タイプは、「POST」または「GET」であってもよい.注意:ここでは、「PUT」、「DELETE」などの他のリクエストタイプを使用することもできますが、すべてのブラウザでサポートされていません.これはcodeplayerの上の説明です.ではajaxメソッドはどのようにデフォルトを「GET」にするのか、次のセグメントを見てください.
	ajaxSettings: {
		url: ajaxLocation,
		type: "GET",
		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
		global: true,
		processData: true,
		async: true,
		contentType: "application/x-www-form-urlencoded; charset=UTF-8"}

note:デフォルトのtypeは「GET」であり、デフォルトではグローバルイベントが実行されます.同時にプロセスデータもtrueである.同時にayncはtrueで、デフォルトが非同期であることを示します!
プロセスデータBooleanタイプ
デフォルト:true.デフォルトでは、data属性で渡されたデータは、オブジェクト(技術的には文字列でない限り)の場合、デフォルトのコンテンツタイプ「アプリケーション/x-www-form-urlencoded」に合わせてクエリー文字列に変換されます.DOMツリー情報または変換したくない他の情報を送信する場合は、falseに設定します.次に、get/postメソッドに基づくgetJSON、getScriptメソッドを見てみましょう.
getJSONソース:
getJSON: function( url, data, callback ) {
		return jQuery.get( url, data, callback, "json" );
	}
これはajax関数,dataTypeが「json」であること,つまりサーバ側から返されたデータをparseJSONで処理しなければならないことを示すものである.
getScriptソース:
getScript: function( url, callback ) {
		return jQuery.get( url, undefined, callback, "script" );
	}
これはgetScript呼び出し時にURLとコールバック関数しか転送できないことを示しています.だからdataのデフォルトはnullで、同時に“script”はajaxの方法に私のdataTypeが“script”であることを教えて、だからajaxの方法の中でajaxPrefilters、ajaxTransport、ajaxConverterなどの多重処理を経て、最後にjQuery.GlobalEvealはコールバック関数を実行します!
実際には$("")を通過することもできる.appendTo(「head」)はスクリプトをロードし、parseHTMLソースコードを読むことでその原理を知ることができます!
ajaxリクエストまたはget/postリクエストの場合、フォームをシーケンス化する必要があり、serializeメソッドを導入しました.
コード1:
var obj={
	name:"xxx",
	sex:"female"
}
var result1=encodeURIComponent(obj);
var result2=decodeURIComponent(result1);
alert(result1+"->"+result2);//  encodeURIComponent                  ,  decodeURIComponent       !
serializeArrayとserializeソース分析:
var rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
var       rsubmittable = /^(?:input|select|textarea|keygen)/i;
 var rcheckableType = (/^(?:checkbox|radio)$/i);
var   rCRLF = /\r?
/g jQuery.fn.extend({ serialize: function() { return jQuery.param( this.serializeArray() ); }, serializeArray: function() { // elements elements, ! return this.map(function() { // Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop( this, "elements" ); return elements ? jQuery.makeArray( elements ) : this; }) .filter(function() { var type = this.type; //filter DOM // Use .is(":disabled") so that fieldset[disabled] works // name , , nodeName input/select/textarea/kengen // type sumbit/button/image/reset/file , checked // checkded , checkbox/radio return this.name && !jQuery( this ).is( ":disabled" ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); }) .map(function( i, elem ) { // // , null null // , , // , ,name , , ! var val = jQuery( this ).val(); return val == null ? null : jQuery.isArray( val ) ? jQuery.map( val, function( val ) { return { name: elem.name, value: val.replace( rCRLF, "\r
" ) }; }) : { name: elem.name, value: val.replace( rCRLF, "\r
" ) }; }).get(); } });
この方法についてのcodeplayerのWebサイトの説明です.serializeArray()関数は、フォーム要素のセットをシーケンス化し、フォームコンテンツをJavaScript配列に符号化するために使用されます.serializeArray()関数は、JSON形式で符号化される文字列を容易にするために、フォームの内容をJSONオブジェクトにシーケンス化するためによく使用される.この関数は、コミットに使用できる各フォームコントロールを、名前とvalueのプロパティ、フォームコントロールの名前とvalueのプロパティを持つObjectオブジェクトにカプセル化します.次に、これらのObjectオブジェクトを配列にカプセル化して返します.この関数は、コミットする必要のないフォームコントロールをシーケンス化しません.これは、通常のフォームコミット動作と一致します.たとえば、
ラベル内にないフォームコントロールはコミットされず、name属性のないフォームコントロールはコミットされず、disabled属性のあるフォームコントロールはコミットされず、選択されていないフォームコントロールはコミットされません.
この中のいくつかの注意すべき点についてお話しします.
(1)formタグ内のフォームがコミットされなくなったのは,elements属性が[object HTML Collection]であるためである.一般的なコントロールはありません.div要素などですが、formラベルはあります.だから、呼び出しオブジェクトがformオブジェクトであれば、そのformオブジェクトの下のすべてのフォーム要素を取得します.divであれば、その要素の下にどれだけのコントロールがあるかにかかわらず、divにはelements属性がありません.これがmapメソッドで、呼び出しオブジェクトのDOM要素ごとにこの関数を実行させます.
(2)前に返されたDOMの集合をフィルタするプロセスであるfilterメソッドを呼び出す.この過程は厳しい.名前が必要です.非表示にする必要があります.input|select|textarea|keygenなどのフォームコントロールをコミットする必要があります.submit|button|image|reset|fileなど、特定のコントロールではありません.またcheckbox/radioではcheckedの存在する要素のみがシーケンス化されます!通常のフォームではname付きのコントロールラベルがコミットされますが、この方法はできません.
(3)最後のmapメソッドは上記の結果を処理し,名前のペアを得,キー名はコントロールのname属性,キー値はvalue値である!同時に「」をすべて「r」に変更
(4)serializeメソッドについてserialize()関数は、フォーム要素のセットをシーケンス化し、フォームの内容をコミット用の文字列に符号化するために使用される.serialize()関数は、AJAXコミットのためにフォームの内容をシーケンス化するためによく使用されます.
この方法の役割は、フォーム要素name/valueをencodeURIComponentによって符号化するとともに、jQueryを内部的に呼び出すため、name 1=value 1&name 2=value 2という文字列を形成することである.paramメソッド!