diff options
| author | Johann-S <[email protected]> | 2017-08-23 12:01:38 +0200 |
|---|---|---|
| committer | XhmikosR <[email protected]> | 2019-02-20 22:05:45 +0200 |
| commit | a3398fffd6e5b73a6a2cc2a1fc454ab199b2bf82 (patch) | |
| tree | 8e89ab30e21d1e2f2c9d3e6395883f505cba63b6 /js/src/dom | |
| parent | 00ca7811718ee7259090be3edaf33a8ea4632876 (diff) | |
| download | bootstrap-a3398fffd6e5b73a6a2cc2a1fc454ab199b2bf82.tar.xz bootstrap-a3398fffd6e5b73a6a2cc2a1fc454ab199b2bf82.zip | |
Add event delegation + fix EventHandler.one
Diffstat (limited to 'js/src/dom')
| -rw-r--r-- | js/src/dom/eventHandler.js | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/js/src/dom/eventHandler.js b/js/src/dom/eventHandler.js index cc792adab..ae3ccafad 100644 --- a/js/src/dom/eventHandler.js +++ b/js/src/dom/eventHandler.js @@ -91,13 +91,27 @@ function bootstrapHandler(element, fn) { } } +function bootstrapDelegationHandler(selector, fn) { + return function (event) { + const domElements = document.querySelectorAll(selector) + for (let target = event.target; target && target !== this; target = target.parentNode) { + for (let i = domElements.length; i--;) { + if (domElements[i] === target) { + return fn.apply(target, [event]) + } + } + } + } +} + const EventHandler = { - on(element, originalTypeEvent, handler) { + on(element, originalTypeEvent, handler, delegationFn) { if (typeof originalTypeEvent !== 'string' || (typeof element === 'undefined' || element === null)) { return } + const delegation = typeof handler === 'string' // allow to get the native events from namespaced events ('click.bs.button' --> 'click') let typeEvent = originalTypeEvent.replace(stripNameRegex, '') const isNative = nativeEvents.indexOf(typeEvent) > -1 @@ -107,12 +121,11 @@ const EventHandler = { const events = getEvent(element) const handlers = events[typeEvent] || (events[typeEvent] = {}) const uid = getUidEvent(handler, originalTypeEvent.replace(namespaceRegex, '')) - // TODO : Handle multi events on one element if (handlers[uid]) { return } - const fn = bootstrapHandler(element, handler) + const fn = !delegation ? bootstrapHandler(element, handler) : bootstrapDelegationHandler(handler, delegationFn) handlers[uid] = fn handler.uidEvent = uid element.addEventListener(typeEvent, fn, false) @@ -125,10 +138,8 @@ const EventHandler = { if (!events || !events[typeEvent]) { return } - const uidEvent = handler.uidEvent - const fn = events[typeEvent][uidEvent] - fn.apply(element, [e]) - EventHandler.off(element, event, handler) + handler.apply(element, [e]) + EventHandler.off(element, event, complete) } EventHandler.on(element, event, complete) }, |
