Added event decorator

This commit is contained in:
Luis Leiva 2017-12-17 20:38:26 +01:00
parent 80dc9732a5
commit 050a727513
6 changed files with 60 additions and 84 deletions

View File

@ -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.

View File

@ -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;
}
});
},
};
/**

View File

@ -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.

View File

@ -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.

View File

@ -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;
}
},
};
/**

View File

@ -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.