Skip to content

Instantly share code, notes, and snippets.

@outoftime
Last active September 12, 2020 19:45
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save outoftime/25a7f627ee6b115e6beb to your computer and use it in GitHub Desktop.
Save outoftime/25a7f627ee6b115e6beb to your computer and use it in GitHub Desktop.
Handle events in the capturing phase with jQuery. Probably has bugs.
$.fn.capture = function(eventName) {
var selector, handler;
if (arguments.length === 2) {
handler = arguments[1];
} else {
selector = arguments[1];
handler = arguments[2];
}
var dispatchEvent = function(syntheticEvent, delegateTarget) {
var nativeEvent = syntheticEvent.originalEvent;
var currentTarget;
if (selector) {
currentTarget = $(nativeEvent.target.closest(selector))[0];
} else {
currentTarget = delegateTarget;
}
if (!currentTarget) return;
var jqueryEvent = $.extend($.event.fix(nativeEvent), {
currentTarget: currentTarget,
delegateTarget: delegateTarget,
target: nativeEvent.target
});
var result = handler.call(currentTarget, jqueryEvent);
if (result === false) {
jqueryEvent.stopPropagation();
jqueryEvent.preventDefault();
}
};
this.each(function() {
var $this = $(this);
var $captureEventListener = $this.data('_capture_event_listener');
if (!$captureEventListener) {
$captureEventListener = $(new Object());
$this.data('_capture_event_listener', $captureEventListener);
}
if (!$captureEventListener.prop(eventName)) {
$captureEventListener.prop(eventName, true);
this.addEventListener(eventName, function(e) {
$captureEventListener.triggerHandler($.Event(e), this);
}, true);
}
$captureEventListener.on(eventName, dispatchEvent);
});
return this;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment