]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
use get selector from element only when needed
authorJohann-S <johann.servoire@gmail.com>
Tue, 23 Jul 2019 19:15:00 +0000 (21:15 +0200)
committerJohann-S <johann.servoire@gmail.com>
Wed, 24 Jul 2019 09:27:35 +0000 (11:27 +0200)
js/src/alert/alert.js
js/src/carousel/carousel.js
js/src/collapse/collapse.js
js/src/dropdown/dropdown.js
js/src/modal/modal.js
js/src/tab/tab.js
js/src/util/index.js
js/src/util/index.spec.js

index 99164bd195d847ad386ebceac32d3cbe9ff68d74..328aa16ae6947a51a422ead3acbf6bef07c032ed 100644 (file)
@@ -9,7 +9,7 @@ import {
   jQuery as $,
   TRANSITION_END,
   emulateTransitionEnd,
-  getSelectorFromElement,
+  getElementFromSelector,
   getTransitionDurationFromElement
 } from '../util/index'
 import Data from '../dom/data'
@@ -90,12 +90,7 @@ class Alert {
   // Private
 
   _getRootElement(element) {
-    const selector = getSelectorFromElement(element)
-    let parent = false
-
-    if (selector) {
-      parent = SelectorEngine.findOne(selector)
-    }
+    let parent = getElementFromSelector(element)
 
     if (!parent) {
       parent = SelectorEngine.closest(element, `.${ClassName.ALERT}`)
index 0e1bad14ac2915e121b12d17974ec649b88524c2..af4229f07c960b000fdb1d1bdd0b07c95200e48b 100644 (file)
@@ -9,7 +9,7 @@ import {
   jQuery as $,
   TRANSITION_END,
   emulateTransitionEnd,
-  getSelectorFromElement,
+  getElementFromSelector,
   getTransitionDurationFromElement,
   isVisible,
   makeArray,
@@ -569,13 +569,7 @@ class Carousel {
   }
 
   static _dataApiClickHandler(event) {
-    const selector = getSelectorFromElement(this)
-
-    if (!selector) {
-      return
-    }
-
-    const target = SelectorEngine.findOne(selector)
+    const target = getElementFromSelector(this)
 
     if (!target || !target.classList.contains(ClassName.CAROUSEL)) {
       return
index 671dc3b6cdb232d238ada3b503fdc69d1f20fd47..c1d9aa2f1b764f5d136e607bf3c32da9f768814a 100644 (file)
@@ -10,6 +10,7 @@ import {
   TRANSITION_END,
   emulateTransitionEnd,
   getSelectorFromElement,
+  getElementFromSelector,
   getTransitionDurationFromElement,
   isElement,
   makeArray,
@@ -244,15 +245,11 @@ class Collapse {
     if (triggerArrayLength > 0) {
       for (let i = 0; i < triggerArrayLength; i++) {
         const trigger = this._triggerArray[i]
-        const selector = getSelectorFromElement(trigger)
+        const elem = getElementFromSelector(trigger)
 
-        if (selector !== null) {
-          const elem = SelectorEngine.findOne(selector)
-
-          if (!elem.classList.contains(ClassName.SHOW)) {
-            trigger.classList.add(ClassName.COLLAPSED)
-            trigger.setAttribute('aria-expanded', false)
-          }
+        if (elem && !elem.classList.contains(ClassName.SHOW)) {
+          trigger.classList.add(ClassName.COLLAPSED)
+          trigger.setAttribute('aria-expanded', false)
         }
       }
     }
@@ -320,8 +317,7 @@ class Collapse {
 
     makeArray(SelectorEngine.find(selector, parent))
       .forEach(element => {
-        const selector = getSelectorFromElement(element)
-        const selected = selector ? SelectorEngine.findOne(selector) : null
+        const selected = getElementFromSelector(element)
 
         this._addAriaAndCollapsedClass(
           selected,
index 8607afe7f57bcd9a371b6c56a1441d3a5ff75ef9..f30c3924b3f1ac361c053640fbe4c1d219f4af0e 100644 (file)
@@ -7,7 +7,7 @@
 
 import {
   jQuery as $,
-  getSelectorFromElement,
+  getElementFromSelector,
   isElement,
   makeArray,
   noop,
@@ -442,14 +442,7 @@ class Dropdown {
   }
 
   static _getParentFromElement(element) {
-    let parent
-    const selector = getSelectorFromElement(element)
-
-    if (selector) {
-      parent = SelectorEngine.findOne(selector)
-    }
-
-    return parent || element.parentNode
+    return getElementFromSelector(element) || element.parentNode
   }
 
   static _dataApiKeydownHandler(event) {
index 4c430a01f5acbb38987f1763a51a64b0d6d667ed..a0e460f228de0e4a78a6fa612d86ff224ccb8f07 100644 (file)
@@ -9,7 +9,7 @@ import {
   jQuery as $,
   TRANSITION_END,
   emulateTransitionEnd,
-  getSelectorFromElement,
+  getElementFromSelector,
   getTransitionDurationFromElement,
   isVisible,
   makeArray,
@@ -549,8 +549,7 @@ class Modal {
  */
 
 EventHandler.on(document, Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
-  const selector = getSelectorFromElement(this)
-  const target = SelectorEngine.findOne(selector)
+  const target = getElementFromSelector(this)
 
   if (this.tagName === 'A' || this.tagName === 'AREA') {
     event.preventDefault()
index e882ff1d2aeb94ae455a5cbe159c34400351778a..c9f4869ef64ef704d1fc66c159bc54b919e2b0a5 100644 (file)
@@ -9,7 +9,7 @@ import {
   jQuery as $,
   TRANSITION_END,
   emulateTransitionEnd,
-  getSelectorFromElement,
+  getElementFromSelector,
   getTransitionDurationFromElement,
   makeArray,
   reflow
@@ -85,10 +85,9 @@ class Tab {
       return
     }
 
-    let target
     let previous
+    const target = getElementFromSelector(this._element)
     const listElement = SelectorEngine.closest(this._element, Selector.NAV_LIST_GROUP)
-    const selector = getSelectorFromElement(this._element)
 
     if (listElement) {
       const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE
@@ -113,10 +112,6 @@ class Tab {
       return
     }
 
-    if (selector) {
-      target = SelectorEngine.findOne(selector)
-    }
-
     this._activate(
       this._element,
       listElement
index 5788c8749e84de0528003823766127f7421d1caf..537b391dccd1e1eab8cb880a5ec82533c46b6cfb 100644 (file)
@@ -28,20 +28,32 @@ const getUID = prefix => {
   return prefix
 }
 
-const getSelectorFromElement = element => {
+const getSelector = element => {
   let selector = element.getAttribute('data-target')
 
   if (!selector || selector === '#') {
     const hrefAttr = element.getAttribute('href')
 
-    selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''
+    selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null
   }
 
-  try {
+  return selector
+}
+
+const getSelectorFromElement = element => {
+  const selector = getSelector(element)
+
+  if (selector) {
     return document.querySelector(selector) ? selector : null
-  } catch (error) {
-    return null
   }
+
+  return null
+}
+
+const getElementFromSelector = element => {
+  const selector = getSelector(element)
+
+  return selector ? document.querySelector(selector) : null
 }
 
 const getTransitionDurationFromElement = element => {
@@ -169,6 +181,7 @@ export {
   TRANSITION_END,
   getUID,
   getSelectorFromElement,
+  getElementFromSelector,
   getTransitionDurationFromElement,
   triggerTransitionEnd,
   isElement,
index bf450ee3657013fa3fc7b8f88fa8526ba63b5633..b667c270eafa5ff466ecceb85d0bd4e68a348412 100644 (file)
@@ -64,6 +64,54 @@ describe('Util', () => {
 
       expect(Util.getSelectorFromElement(testEl)).toBeNull()
     })
+
+    it('should return null if no selector', () => {
+      fixtureEl.innerHTML = '<div></div>'
+
+      const testEl = fixtureEl.querySelector('div')
+
+      expect(Util.getSelectorFromElement(testEl)).toBeNull()
+    })
+  })
+
+  describe('getElementFromSelector', () => {
+    it('should get element from data-target', () => {
+      fixtureEl.innerHTML = [
+        '<div id="test" data-target=".target"></div>',
+        '<div class="target"></div>'
+      ].join('')
+
+      const testEl = fixtureEl.querySelector('#test')
+
+      expect(Util.getElementFromSelector(testEl)).toEqual(fixtureEl.querySelector('.target'))
+    })
+
+    it('should get element from href if no data-target set', () => {
+      fixtureEl.innerHTML = [
+        '<a id="test" href=".target"></a>',
+        '<div class="target"></div>'
+      ].join('')
+
+      const testEl = fixtureEl.querySelector('#test')
+
+      expect(Util.getElementFromSelector(testEl)).toEqual(fixtureEl.querySelector('.target'))
+    })
+
+    it('should return null if element not found', () => {
+      fixtureEl.innerHTML = '<a id="test" href=".target"></a>'
+
+      const testEl = fixtureEl.querySelector('#test')
+
+      expect(Util.getElementFromSelector(testEl)).toBeNull()
+    })
+
+    it('should return null if no selector', () => {
+      fixtureEl.innerHTML = '<div></div>'
+
+      const testEl = fixtureEl.querySelector('div')
+
+      expect(Util.getElementFromSelector(testEl)).toBeNull()
+    })
   })
 
   describe('getTransitionDurationFromElement', () => {