]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
Add event delegation + fix EventHandler.one
authorJohann-S <johann.servoire@gmail.com>
Wed, 23 Aug 2017 10:01:38 +0000 (12:01 +0200)
committerXhmikosR <xhmikosr@gmail.com>
Wed, 20 Feb 2019 20:05:45 +0000 (22:05 +0200)
js/src/alert.js
js/src/dom/eventHandler.js

index 4a63b1737d4ef5c2c5e7980ad291c09e5e5bb54a..5e99f6d01179a97cb6f4591c3b69c2f245c7f637 100644 (file)
@@ -153,12 +153,7 @@ class Alert {
  * Data Api implementation
  * ------------------------------------------------------------------------
  */
-
-$(document).on(
-  Event.CLICK_DATA_API,
-  Selector.DISMISS,
-  Alert._handleDismiss(new Alert())
-)
+EventHandler.on(document, Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()))
 
 /**
  * ------------------------------------------------------------------------
index cc792adab5eb0792b56aa48ff1ff10f310333013..ae3ccafadb58661ba944074b83d6fae07f7fad55 100644 (file)
@@ -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)
   },