site-accueil-insa/matomo/plugins/CoreVue/polyfills/src/jqueryNativeEventTrigger.ts

71 lines
2.2 KiB
TypeScript

/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
const oldTrigger = window.$.fn.trigger;
function triggerWithNativeEventDispatch(jqEventOrType, data) {
let isFirstElementOnPath = true;
const type = jqEventOrType.type || jqEventOrType;
const onEventAttributeName = `on${type}`;
function nativeDispatchSingleElement(element: HTMLElement) {
if (isFirstElementOnPath) {
isFirstElementOnPath = false;
if (element[onEventAttributeName]
|| (element[type] instanceof Function
// jquery disables calling the native click() method for links
&& !(type === 'click' && element.tagName.toUpperCase() === 'A'))
) {
// if a on... (eg, onchange) handler is specified, it will be triggered by jquery.
// it will also be triggered by addEventListener, and we don't want that so just
// assume there is no addEventListener event.
// NOTE: this only happens for the FIRST element on the event path. jquery's trigger
// function will not call .click() on any other element in the event path.
return;
}
}
// eslint-disable-next-line
if (((window.$._data(element, 'events') || {}) as any)[type] && window.$._data(element, 'handle')) {
// there is an event handler in jquery private data, assume this was handled.
return;
}
if (element.dispatchEvent) {
const event = new Event(type, {
// do not rely on browser bubbling so we can keep checking for the on... attribute
bubbles: false,
cancelable: true,
});
element.dispatchEvent(event);
}
}
function nativeDispatch(element: HTMLElement) {
nativeDispatchSingleElement(element);
const parent = element.parentElement;
if (parent) {
nativeDispatch(parent);
}
}
const result = oldTrigger.call(this, jqEventOrType, data);
if (type === 'focus' || type === 'blur') { // jquery handles focus/blur fine
return result;
}
this.each(function onEach() {
nativeDispatch(this);
});
return result;
}
window.$.fn.trigger = triggerWithNativeEventDispatch;