This is a basic delayed observer for jQuery.
Here a very simple example of how you can use this script:
<input type="text" id="input-A" />
<input type="text" id="input-B" />
$(document).ready(function(){
$('#input-A').delayedObserver(0.8,
function(value, object) {
$('#input-B').val(value);}});
/*
jQuery delayed observer - 0.3
(c) 2007 ~ Maxime Haineault (haineault@gmail.com)
MIT License (http://www.opensource.org/licenses/mit-license.php)
changelog
---------
0.2 using closure, special thanks to Stephen Goguen & Tane Piper.
0.3 now allow object chaining, added license
*/
(function() {
var delayedObserverStack = [];
var observed;
function delayedObserverCallback(stackPos) {
observed = delayedObserverStack[stackPos];
if (observed.timer) clearTimeout(observed.timer);
observed.timer = setTimeout(function(){
observed.timer = null;
observed.callback(observed.obj.val(), observed.obj);
}, observed.delay * 1000);
observed.oldVal = observed.obj.val();
}
jQuery.fn.extend({
delayedObserver:function(delay, callback){
$this = $(this);
delayedObserverStack.push({
obj: $this, timer: null, delay: delay,
oldVal: $this.val(), callback: callback
});
stackPos = delayedObserverStack.length-1;
$this.keyup(function() {
observed = delayedObserverStack[stackPos];
if (observed.obj.val() == observed.obj.oldVal) return;
else delayedObserverCallback(stackPos);
});
return this;
}
});
})();
I've made some code cleanup and added support for custom events (other than keyup) in 0.4, it's still untested for now. But feel free to play with and report me bugs/improvments. Thanks.
Nothing has changed in the API, except that now it takes a third optional parameter to specify the event type ex: {event:'keyup'}. Should be 100% compatible with preview versions.
/*
jQuery delayed observer - 0.4
(c) 2007 ~ Maxime Haineault (haineault@gmail.com)
MIT License (http://www.opensource.org/licenses/mit-license.php)
changelog
---------
0.2 using closure, special thanks to Stephen Goguen & Tane Piper.
0.3 now allow object chaining, added license
0.4 code cleanup, added support for other events than keyup
*/
(function() {
var stack = [], target;
function callback(pos) {
target = stack[pos];
if (target.timer) clearTimeout(target.timer);
target.timer = setTimeout(function(){
target.timer = null;
target.callback(target.obj.val(), target.obj);
}, target.delay * 1000);
target.oldVal = target.obj.val();
}
jQuery.fn.extend({
delayedObserver:function(delay, callback, opt){
$this = $(this), event = opt.event || 'keyup';
stack.push({
obj: $this, timer: null, delay: delay,
oldVal: $this.val(), callback: callback});
pos = stack.length-1;
$this.[event](function() {
target = stack[pos];
if (target.obj.val() == target.obj.oldVal) return;
else callback(pos);
});
return this;
}
});
})();