Property watchers
by Christopher Pitt
HTML
<div id="puppet"></div>
JavaScript
// should be used with: https://github.com/sixtyseconds/mootools-unified-timer
(function(){
var id = 0,
lookup = {},
hasOnPropertyChange = Browser.ie6 || Browser.ie7 || Browser.ie8,
hasDOMAttrModified = (Browser.opera && Browser.version >= 7) || Browser.firefox || (Browser.ie && Browser.version >= 9);
Element.implement({
'addWatcher': function(property, callback, repeat) {
var me = id++;
lookup[me] = {
'worker': function(before, after) {
var now = after || this.get(lookup[me].property);
callback(before || lookup[me].last, now);
lookup[me].last = now;
},
'watcher': 'watcher-' + property + '-' + me,
'repeat': repeat || 50,
'property': property,
'last': this.get(property)
};
if (hasOnPropertyChange) {
this.addListener('onpropertychange', lookup[me].worker);
} else if (hasDOMAttrModified) {
this.addListener('DOMAttrModified', lookup[me].worker);
} else {
lookup[me].interval = setInterval(function(){
var before = lookup[me].last,
after = this.get(lookup[me].property);
if (before != after) {
lookup[me].worker(before, after);
}
}.bind(this), lookup[me].repeat);
}
return me;
},
'addWatchers': function(watchers) {
var us = [];
Object.each(watchers, function(watcher, key) {
us.push(this.addWatcher(key, watcher));
}.bind(this));
return us;
},
'removeWatcher': function(me) {
if (hasOnPropertyChange) {
...