doevisualizations
Version:
Data Visualization Library based on RequireJS and D3.js (v4+)
92 lines (79 loc) • 2.39 kB
JavaScript
steal('jquery', function($) {
$.event.reverse = function(name, attributes) {
var bound = $(),
count = 0,
dispatch = $.event.handle || $.event.dispatch;
$.event.special[name] = {
setup: function() {
// add and sort the resizers array
// don't add window because it can't be compared easily
if ( this !== window ) {
bound.push(this);
$.unique(bound);
}
// returns false if the window
return this !== window;
},
teardown: function() {
// we shouldn't have to sort
bound = bound.not(this);
// returns false if the window
return this !== window;
},
add: function( handleObj ) {
var origHandler = handleObj.handler;
handleObj.origHandler = origHandler;
handleObj.handler = function( ev, data ) {
var isWindow = this === window;
if(attributes && attributes.handler) {
var result = attributes.handler.apply(this, arguments);
if(result === true) {
return;
}
}
// if this is the first handler for this event ...
if ( count === 0 ) {
// prevent others from doing what we are about to do
count++;
var where = data === false ? ev.target : this
// trigger all this element's handlers
dispatch.call(where, ev, data);
if ( ev.isPropagationStopped() ) {
count--;
return;
}
// get all other elements within this element that listen to move
// and trigger their resize events
var index = bound.index(this),
length = bound.length,
child, sub;
// if index == -1 it's the window
while (++index < length && (child = bound[index]) && (isWindow || $.contains(where, child)) ) {
// call the event
dispatch.call(child, ev, data);
if ( ev.isPropagationStopped() ) {
// move index until the item is not in the current child
while (++index < length && (sub = bound[index]) ) {
if (!$.contains(child, sub) ) {
// set index back one
index--;
break
}
}
}
}
// prevent others from responding
ev.stopImmediatePropagation();
count--;
} else {
handleObj.origHandler.call(this, ev, data);
}
}
}
};
// automatically bind on these
$([document, window]).bind(name, function() {});
return $.event.special[name];
}
return $;
})