Skip to content

Instantly share code, notes, and snippets.

@robcowie
Created April 21, 2010 15:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save robcowie/373932 to your computer and use it in GitHub Desktop.
Save robcowie/373932 to your computer and use it in GitHub Desktop.
// Usage
// $.dataSpy()
// $(document).bind('data.change', function(){console.log('data changed')} )
// $(document).bind('data.unchange', function(){console.log('data unchanged')} )
(function($) {
function hash(data, n) {
var norm = Math.pow(2, -32);
var a = 2095533;
var s = 0, c = 1;
var t, t0 = 0;
data = data.toString();
for (var i = 0; i < data.length; i++) {
s -= data.charCodeAt(i) * 65537 * norm;
if (s < 0) {
s += 1;
}
t = a * s + c * norm;
t0 = s = t - (c = t | 0);
t = a * s + c * norm;
s = t - (c = t | 0);
};
if (n) {
return Math.floor(n * (s + t0 * norm));
} else {
return s + t0 * norm;
};
};
$.dataSpy = function(settings) {
var config = {
'changeEvent': 'data.change',
'undoEvent': 'data.unchanged',
'hasher': hash,
'selector': 'input textarea select'
};
if (settings) $.extend(config, settings);
function concat_values(elements){
var data = '';
elements.each(function(){
data = data + this.val();
});
return data;
};
var initial_values = concat_values($(config.selector));
var initial_hash = config.hasher(initial_values);
// Bind to onchange for all elements. TODO: Use .live()
data_elements.bind('change', function(){
var values = concat_values($(config.selector));
var h = config.hasher(values);
if (h != initial_hash) {
$(document).trigger(config.changeEvent);
} else {
$(document).trigger(config.undoEvent);
};
});
};
})(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment