diff --git a/jquery.sketchable.animate.js b/jquery.sketchable.animate.js index 15f1321..8ac81c6 100644 --- a/jquery.sketchable.animate.js +++ b/jquery.sketchable.animate.js @@ -132,31 +132,12 @@ }, }; - // A helper function to override user-defined event listeners. - function override(evName) { - // Flag event override so that it doesn't get fired more than once. - if (config.options['_bound.animate$' + evName]) return; - config.options['_bound.animate$' + evName] = true; - - if (config.options.events && typeof config.options.events[evName] === 'function') { - // User has defined this event, so wrap it. - var fn = config.options.events[evName]; - config.options.events[evName] = function() { - // Exec original function first, then exec our callback. - fn.apply($instance, arguments); - callbacks[evName].apply($instance, arguments); - }; - } else { - // User has not defined this event, so attach our callback. - config.options.events[evName] = callbacks[evName]; - } - } - // Note: the init event is used to create sketchable instances, // therefore it should NOT be overriden. var events = 'clear destroy'.split(' '); for (var i = 0; i < events.length; i++) { - override(events[i]); + var evName = events[i]; + $instance.sketchable('decorateEvent', evName, callbacks[evName], 'animate'); } // Expose public API: all jQuery sketchable instances will have these methods. diff --git a/jquery.sketchable.js b/jquery.sketchable.js index aeea03a..81b470e 100644 --- a/jquery.sketchable.js +++ b/jquery.sketchable.js @@ -207,6 +207,33 @@ options.events.destroy(elem, data); }); }, + /** + * Decorate event. Will execute default event first. + * @param {string} evName - Event name. + * @param {function} listener - Custom event listener. + * @param {string} initiator - Some identifier. + */ + decorateEvent: function(evName, listener, initiator) { + return this.each(function() { + var elem = $(this), data = elem.data(namespace), options = data.options; + // Flag event override so that it doesn't get fired more than once. + var overrideId = '_bound$'+ evName + '.' + initiator; + if (data[overrideId]) return; + data[overrideId] = true; + if (options.events && typeof options.events[evName] === 'function') { + // User has defined this event, so wrap it. + var fn = options.events[evName]; + options.events[evName] = function() { + // Exec original function first, then exec our listener. + fn.apply(this, arguments); + listener.apply(this, arguments); + }; + } else { + // User has not defined this event, so attach our listener. + options.events[evName] = listener; + } + }); + }, }; /** diff --git a/jquery.sketchable.memento.js b/jquery.sketchable.memento.js index 619acd1..14574d0 100644 --- a/jquery.sketchable.memento.js +++ b/jquery.sketchable.memento.js @@ -183,31 +183,12 @@ }, }; - // A helper function to override user-defined event listeners. - function override(evName) { - // Flag event override so that it doesn't get fired more than once. - if (config.options['_bound.memento$' + evName]) return; - config.options['_bound.memento$' + evName] = true; - - if (config.options.events && typeof config.options.events[evName] === 'function') { - // User has defined this event, so wrap it. - var fn = config.options.events[evName]; - config.options.events[evName] = function() { - // Exec original function first, then exec our callback. - fn.apply($instance, arguments); - callbacks[evName].apply($instance, arguments); - }; - } else { - // User has not defined this event, so attach our callback. - config.options.events[evName] = callbacks[evName]; - } - } - // Note: the init event is used to create jQuery sketchable instances, // therefore it should NOT be overriden. var events = 'mouseup clear destroy'.split(' '); for (var i = 0; i < events.length; i++) { - override(events[i]); + var evName = events[i]; + $instance.sketchable('decorateEvent', evName, callbacks[evName], 'memento'); } // Expose public API: all jQuery sketchable instances will have these methods. diff --git a/sketchable.animate.js b/sketchable.animate.js index 090fda0..4c2dbbf 100644 --- a/sketchable.animate.js +++ b/sketchable.animate.js @@ -134,31 +134,12 @@ }, }; - // A helper function to override user-defined event listeners. - function override(evName) { - // Flag event override so that it doesn't get fired more than once. - if (config.options['_bound.animate$' + evName]) return; - config.options['_bound.animate$' + evName] = true; - - if (config.options.events && typeof config.options.events[evName] === 'function') { - // User has defined this event, so wrap it. - var fn = config.options.events[evName]; - config.options.events[evName] = function() { - // Exec original function first, then exec our callback. - fn.apply(instance, arguments); - callbacks[evName].apply(instance, arguments); - }; - } else { - // User has not defined this event, so attach our callback. - config.options.events[evName] = callbacks[evName]; - } - } - // Note: the init event is used to create sketchable instances, // therefore it should NOT be overriden. var events = 'clear destroy'.split(' '); for (var i = 0; i < events.length; i++) { - override(events[i]); + var evName = events[i]; + instance.decorateEvent(evName, callbacks[evName], 'animate'); } // Expose public API: all Sketchable instances will have these methods. diff --git a/sketchable.js b/sketchable.js index 588a1a7..d8e71ea 100644 --- a/sketchable.js +++ b/sketchable.js @@ -236,7 +236,32 @@ return this; }, + /** + * Decorate event. Will execute default event first. + * @param {string} evName - Event name. + * @param {function} listener - Custom event listener. + * @param {string} initiator - Some identifier. + */ + decorateEvent: function(evName, listener, initiator) { + var elem = this.elem, data = dataBind(elem)[namespace], options = data.options; + // Flag event override so that it doesn't get fired more than once. + var overrideId = '_bound$'+ evName + '.' + initiator; + if (data[overrideId]) return; + data[overrideId] = true; + if (options.events && typeof options.events[evName] === 'function') { + // User has defined this event, so wrap it. + var fn = options.events[evName]; + options.events[evName] = function() { + // Exec original function first, then exec our listener. + fn.apply(this, arguments); + listener.apply(this, arguments); + }; + } else { + // User has not defined this event, so attach our listener. + options.events[evName] = listener; + } + }, }; /** diff --git a/sketchable.memento.js b/sketchable.memento.js index 0a7b0e4..6710284 100644 --- a/sketchable.memento.js +++ b/sketchable.memento.js @@ -185,31 +185,12 @@ }, }; - // A helper function to override user-defined event listeners. - function override(evName) { - // Flag event override so that it doesn't get fired more than once. - if (config.options['_bound.memento$' + evName]) return; - config.options['_bound.memento$' + evName] = true; - - if (config.options.events && typeof config.options.events[evName] === 'function') { - // User has defined this event, so wrap it. - var fn = config.options.events[evName]; - config.options.events[evName] = function() { - // Exec original function first, then exec our callback. - fn.apply(instance, arguments); - callbacks[evName].apply(instance, arguments); - }; - } else { - // User has not defined this event, so attach our callback. - config.options.events[evName] = callbacks[evName]; - } - } - // Note: the init event is used to create Sketchable instances, // therefore it should NOT be overriden. var events = 'mouseup clear destroy'.split(' '); for (var i = 0; i < events.length; i++) { - override(events[i]); + var evName = events[i]; + instance.decorateEvent(evName, callbacks[evName], 'memento'); } // Expose public API: all Sketchable instances will have these methods.