1. 程式人生 > >jQuery 計時器(jquery timers)簡單應用

jQuery 計時器(jquery timers)簡單應用

/**
* 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) {
returnthis.each(function() {
jQuery.timer.add(
this, interval, label, fn, times);
});
},
oneTime:
function(interval, label, fn) {
returnthis.each(function() {
jQuery.timer.add(
this, interval, label, fn, 1);
});
},
stopTime:
function(label, fn) {
returnthis.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)
returnnull;
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);
}
elseif ( 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);
});
});