You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							138 lines
						
					
					
						
							3.1 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							138 lines
						
					
					
						
							3.1 KiB
						
					
					
				| /** | |
|  * jQuery.timers - Timer abstractions for jQuery | |
|  * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com) | |
|  * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/). | |
|  * Date: 2009/10/16 | |
|  * | |
|  * @author Blair Mitchelmore | |
|  * @version 1.2 | |
|  * | |
|  **/ | |
| 
 | |
| jQuery.fn.extend({ | |
| 	everyTime: function(interval, label, fn, times) { | |
| 		return this.each(function() { | |
| 			jQuery.timer.add(this, interval, label, fn, times); | |
| 		}); | |
| 	}, | |
| 	oneTime: function(interval, label, fn) { | |
| 		return this.each(function() { | |
| 			jQuery.timer.add(this, interval, label, fn, 1); | |
| 		}); | |
| 	}, | |
| 	stopTime: function(label, fn) { | |
| 		return this.each(function() { | |
| 			jQuery.timer.remove(this, label, fn); | |
| 		}); | |
| 	} | |
| }); | |
| 
 | |
| jQuery.extend({ | |
| 	timer: { | |
| 		global: [], | |
| 		guid: 1, | |
| 		dataKey: "jQuery.timer", | |
| 		regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/, | |
| 		powers: { | |
| 			// Yeah this is major overkill... | |
| 			'ms': 1, | |
| 			'cs': 10, | |
| 			'ds': 100, | |
| 			's': 1000, | |
| 			'das': 10000, | |
| 			'hs': 100000, | |
| 			'ks': 1000000 | |
| 		}, | |
| 		timeParse: function(value) { | |
| 			if (value == undefined || value == null) | |
| 				return null; | |
| 			var result = this.regex.exec(jQuery.trim(value.toString())); | |
| 			if (result[2]) { | |
| 				var num = parseFloat(result[1]); | |
| 				var mult = this.powers[result[2]] || 1; | |
| 				return num * mult; | |
| 			} else { | |
| 				return value; | |
| 			} | |
| 		}, | |
| 		add: function(element, interval, label, fn, times) { | |
| 			var counter = 0; | |
| 			 | |
| 			if (jQuery.isFunction(label)) { | |
| 				if (!times)  | |
| 					times = fn; | |
| 				fn = label; | |
| 				label = interval; | |
| 			} | |
| 			 | |
| 			interval = jQuery.timer.timeParse(interval); | |
| 
 | |
| 			if (typeof interval != 'number' || isNaN(interval) || interval < 0) | |
| 				return; | |
| 
 | |
| 			if (typeof times != 'number' || isNaN(times) || times < 0)  | |
| 				times = 0; | |
| 			 | |
| 			times = times || 0; | |
| 			 | |
| 			var timers = jQuery.data(element, this.dataKey) || jQuery.data(element, this.dataKey, {}); | |
| 			 | |
| 			if (!timers[label]) | |
| 				timers[label] = {}; | |
| 			 | |
| 			fn.timerID = fn.timerID || this.guid++; | |
| 			 | |
| 			var handler = function() { | |
| 				if ((++counter > times && times !== 0) || fn.call(element, counter) === false) | |
| 					jQuery.timer.remove(element, label, fn); | |
| 			}; | |
| 			 | |
| 			handler.timerID = fn.timerID; | |
| 			 | |
| 			if (!timers[label][fn.timerID]) | |
| 				timers[label][fn.timerID] = window.setInterval(handler,interval); | |
| 			 | |
| 			this.global.push( element ); | |
| 			 | |
| 		}, | |
| 		remove: function(element, label, fn) { | |
| 			var timers = jQuery.data(element, this.dataKey), ret; | |
| 			 | |
| 			if ( timers ) { | |
| 				 | |
| 				if (!label) { | |
| 					for ( label in timers ) | |
| 						this.remove(element, label, fn); | |
| 				} else if ( timers[label] ) { | |
| 					if ( fn ) { | |
| 						if ( fn.timerID ) { | |
| 							window.clearInterval(timers[label][fn.timerID]); | |
| 							delete timers[label][fn.timerID]; | |
| 						} | |
| 					} else { | |
| 						for ( var fn in timers[label] ) { | |
| 							window.clearInterval(timers[label][fn]); | |
| 							delete timers[label][fn]; | |
| 						} | |
| 					} | |
| 					 | |
| 					for ( ret in timers[label] ) break; | |
| 					if ( !ret ) { | |
| 						ret = null; | |
| 						delete timers[label]; | |
| 					} | |
| 				} | |
| 				 | |
| 				for ( ret in timers ) break; | |
| 				if ( !ret )  | |
| 					jQuery.removeData(element, this.dataKey); | |
| 			} | |
| 		} | |
| 	} | |
| }); | |
| 
 | |
| jQuery(window).bind("unload", function() { | |
| 	jQuery.each(jQuery.timer.global, function(index, item) { | |
| 		jQuery.timer.remove(item); | |
| 	}); | |
| });
 |