app/jquery/jquery-ajaxQueue.js
changeset 1235 41cb87ed9b81
parent 1212 1b64b5922227
equal deleted inserted replaced
1234:a6ccb08911eb 1235:41cb87ed9b81
       
     1 /**
       
     2  * Ajax Queue Plugin
       
     3  *
       
     4  * Homepage: http://jquery.com/plugins/project/ajaxqueue
       
     5  * Documentation: http://docs.jquery.com/AjaxQueue
       
     6  */
       
     7 
       
     8 /**
       
     9 
       
    10 <script>
       
    11 $(function(){
       
    12 	jQuery.ajaxQueue({
       
    13 		url: "test.php",
       
    14 		success: function(html){ jQuery("ul").append(html); }
       
    15 	});
       
    16 	jQuery.ajaxQueue({
       
    17 		url: "test.php",
       
    18 		success: function(html){ jQuery("ul").append(html); }
       
    19 	});
       
    20 	jQuery.ajaxSync({
       
    21 		url: "test.php",
       
    22 		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
       
    23 	});
       
    24 	jQuery.ajaxSync({
       
    25 		url: "test.php",
       
    26 		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
       
    27 	});
       
    28 });
       
    29 </script>
       
    30 <ul style="position: absolute; top: 5px; right: 5px;"></ul>
       
    31 
       
    32  */
       
    33 /*
       
    34  * Queued Ajax requests.
       
    35  * A new Ajax request won't be started until the previous queued
       
    36  * request has finished.
       
    37  */
       
    38 
       
    39 /*
       
    40  * Synced Ajax requests.
       
    41  * The Ajax request will happen as soon as you call this method, but
       
    42  * the callbacks (success/error/complete) won't fire until all previous
       
    43  * synced requests have been completed.
       
    44  */
       
    45 
       
    46 
       
    47 (function($) {
       
    48 
       
    49 	var ajax = $.ajax;
       
    50 
       
    51 	var pendingRequests = {};
       
    52 
       
    53 	var synced = [];
       
    54 	var syncedData = [];
       
    55 
       
    56 	$.ajax = function(settings) {
       
    57 		// create settings for compatibility with ajaxSetup
       
    58 		settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings));
       
    59 
       
    60 		var port = settings.port;
       
    61 
       
    62 		switch(settings.mode) {
       
    63 		case "abort":
       
    64 			if ( pendingRequests[port] ) {
       
    65 				pendingRequests[port].abort();
       
    66 			}
       
    67 			return pendingRequests[port] = ajax.apply(this, arguments);
       
    68 		case "queue":
       
    69 			var _old = settings.complete;
       
    70 			settings.complete = function(){
       
    71 				if ( _old )
       
    72 					_old.apply( this, arguments );
       
    73 				jQuery([ajax]).dequeue("ajax" + port );;
       
    74 			};
       
    75 
       
    76 			jQuery([ ajax ]).queue("ajax" + port, function(){
       
    77 				ajax( settings );
       
    78 			});
       
    79 			return;
       
    80 		case "sync":
       
    81 			var pos = synced.length;
       
    82 
       
    83 			synced[ pos ] = {
       
    84 				error: settings.error,
       
    85 				success: settings.success,
       
    86 				complete: settings.complete,
       
    87 				done: false
       
    88 			};
       
    89 
       
    90 			syncedData[ pos ] = {
       
    91 				error: [],
       
    92 				success: [],
       
    93 				complete: []
       
    94 			};
       
    95 
       
    96 			settings.error = function(){ syncedData[ pos ].error = arguments; };
       
    97 			settings.success = function(){ syncedData[ pos ].success = arguments; };
       
    98 			settings.complete = function(){
       
    99 				syncedData[ pos ].complete = arguments;
       
   100 				synced[ pos ].done = true;
       
   101 
       
   102 				if ( pos == 0 || !synced[ pos-1 ] )
       
   103 					for ( var i = pos; i < synced.length && synced[i].done; i++ ) {
       
   104 						if ( synced[i].error ) synced[i].error.apply( jQuery, syncedData[i].error );
       
   105 						if ( synced[i].success ) synced[i].success.apply( jQuery, syncedData[i].success );
       
   106 						if ( synced[i].complete ) synced[i].complete.apply( jQuery, syncedData[i].complete );
       
   107 
       
   108 						synced[i] = null;
       
   109 						syncedData[i] = null;
       
   110 					}
       
   111 			};
       
   112 		}
       
   113 		return ajax.apply(this, arguments);
       
   114 	};
       
   115 
       
   116 })(jQuery);