mirror of
https://github.com/tenrok/bootstrap.git
synced 2026-06-20 20:00:36 +03:00
refactor: Move getElementFromSelector & getSelectorFromElement
Move `getElementFromSelector` & getSelectorFromElement` inside selector-engine.js, in order to use SelectorEngine methods, avoiding raw querySelector usage Feature: add `getMultipleElementsFromSelector` helper
This commit is contained in:
+1
-2
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
defineJQueryPlugin,
|
defineJQueryPlugin,
|
||||||
getElementFromSelector,
|
|
||||||
getNextActiveElement,
|
getNextActiveElement,
|
||||||
isRTL,
|
isRTL,
|
||||||
isVisible,
|
isVisible,
|
||||||
@@ -16,7 +15,7 @@ import {
|
|||||||
} from './util/index'
|
} from './util/index'
|
||||||
import EventHandler from './dom/event-handler'
|
import EventHandler from './dom/event-handler'
|
||||||
import Manipulator from './dom/manipulator'
|
import Manipulator from './dom/manipulator'
|
||||||
import SelectorEngine from './dom/selector-engine'
|
import { getElementFromSelector, SelectorEngine } from './dom/selector-engine'
|
||||||
import Swipe from './util/swipe'
|
import Swipe from './util/swipe'
|
||||||
import BaseComponent from './base-component'
|
import BaseComponent from './base-component'
|
||||||
|
|
||||||
|
|||||||
+8
-12
@@ -5,15 +5,14 @@
|
|||||||
* --------------------------------------------------------------------------
|
* --------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {
|
import { defineJQueryPlugin, getElement, reflow } from './util/index'
|
||||||
defineJQueryPlugin,
|
|
||||||
getElement,
|
|
||||||
getElementFromSelector,
|
|
||||||
getSelectorFromElement,
|
|
||||||
reflow
|
|
||||||
} from './util/index'
|
|
||||||
import EventHandler from './dom/event-handler'
|
import EventHandler from './dom/event-handler'
|
||||||
import SelectorEngine from './dom/selector-engine'
|
import {
|
||||||
|
getElementFromSelector,
|
||||||
|
getMultipleElementsFromSelector,
|
||||||
|
getSelectorFromElement,
|
||||||
|
SelectorEngine
|
||||||
|
} from './dom/selector-engine'
|
||||||
import BaseComponent from './base-component'
|
import BaseComponent from './base-component'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -285,10 +284,7 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (
|
|||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
}
|
}
|
||||||
|
|
||||||
const selector = getSelectorFromElement(this)
|
for (const element of getMultipleElementsFromSelector(this)) {
|
||||||
const selectorElements = SelectorEngine.find(selector)
|
|
||||||
|
|
||||||
for (const element of selectorElements) {
|
|
||||||
Collapse.getOrCreateInstance(element, { toggle: false }).toggle()
|
Collapse.getOrCreateInstance(element, { toggle: false }).toggle()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -80,4 +80,56 @@ const SelectorEngine = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default SelectorEngine
|
const getSelector = element => {
|
||||||
|
let selector = element.getAttribute('data-bs-target')
|
||||||
|
|
||||||
|
if (!selector || selector === '#') {
|
||||||
|
let hrefAttribute = element.getAttribute('href')
|
||||||
|
|
||||||
|
// The only valid content that could double as a selector are IDs or classes,
|
||||||
|
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
|
||||||
|
// `document.querySelector` will rightfully complain it is invalid.
|
||||||
|
// See https://github.com/twbs/bootstrap/issues/32273
|
||||||
|
if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
// Just in case some CMS puts out a full URL with the anchor appended
|
||||||
|
if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
|
||||||
|
hrefAttribute = `#${hrefAttribute.split('#')[1]}`
|
||||||
|
}
|
||||||
|
|
||||||
|
selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null
|
||||||
|
}
|
||||||
|
|
||||||
|
return selector
|
||||||
|
}
|
||||||
|
|
||||||
|
const getSelectorFromElement = element => {
|
||||||
|
const selector = getSelector(element)
|
||||||
|
|
||||||
|
if (selector) {
|
||||||
|
return SelectorEngine.findOne(selector) ? selector : null
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
const getElementFromSelector = element => {
|
||||||
|
const selector = getSelector(element)
|
||||||
|
|
||||||
|
return selector ? SelectorEngine.findOne(selector) : null
|
||||||
|
}
|
||||||
|
|
||||||
|
const getMultipleElementsFromSelector = element => {
|
||||||
|
const selector = getSelector(element)
|
||||||
|
|
||||||
|
return selector ? SelectorEngine.find(selector) : []
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
SelectorEngine,
|
||||||
|
getElementFromSelector,
|
||||||
|
getMultipleElementsFromSelector,
|
||||||
|
getSelectorFromElement
|
||||||
|
}
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,7 @@ import {
|
|||||||
} from './util/index'
|
} from './util/index'
|
||||||
import EventHandler from './dom/event-handler'
|
import EventHandler from './dom/event-handler'
|
||||||
import Manipulator from './dom/manipulator'
|
import Manipulator from './dom/manipulator'
|
||||||
import SelectorEngine from './dom/selector-engine'
|
import { SelectorEngine } from './dom/selector-engine'
|
||||||
import BaseComponent from './base-component'
|
import BaseComponent from './base-component'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+2
-2
@@ -5,9 +5,9 @@
|
|||||||
* --------------------------------------------------------------------------
|
* --------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { defineJQueryPlugin, getElementFromSelector, isRTL, isVisible, reflow } from './util/index'
|
import { defineJQueryPlugin, isRTL, isVisible, reflow } from './util/index'
|
||||||
import EventHandler from './dom/event-handler'
|
import EventHandler from './dom/event-handler'
|
||||||
import SelectorEngine from './dom/selector-engine'
|
import { getElementFromSelector, SelectorEngine } from './dom/selector-engine'
|
||||||
import ScrollBarHelper from './util/scrollbar'
|
import ScrollBarHelper from './util/scrollbar'
|
||||||
import BaseComponent from './base-component'
|
import BaseComponent from './base-component'
|
||||||
import Backdrop from './util/backdrop'
|
import Backdrop from './util/backdrop'
|
||||||
|
|||||||
+1
-2
@@ -7,14 +7,13 @@
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
defineJQueryPlugin,
|
defineJQueryPlugin,
|
||||||
getElementFromSelector,
|
|
||||||
isDisabled,
|
isDisabled,
|
||||||
isVisible
|
isVisible
|
||||||
} from './util/index'
|
} from './util/index'
|
||||||
import ScrollBarHelper from './util/scrollbar'
|
import ScrollBarHelper from './util/scrollbar'
|
||||||
import EventHandler from './dom/event-handler'
|
import EventHandler from './dom/event-handler'
|
||||||
import BaseComponent from './base-component'
|
import BaseComponent from './base-component'
|
||||||
import SelectorEngine from './dom/selector-engine'
|
import { getElementFromSelector, SelectorEngine } from './dom/selector-engine'
|
||||||
import Backdrop from './util/backdrop'
|
import Backdrop from './util/backdrop'
|
||||||
import FocusTrap from './util/focustrap'
|
import FocusTrap from './util/focustrap'
|
||||||
import { enableDismissTrigger } from './util/component-functions'
|
import { enableDismissTrigger } from './util/component-functions'
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
import { defineJQueryPlugin, getElement, isDisabled, isVisible } from './util/index'
|
import { defineJQueryPlugin, getElement, isDisabled, isVisible } from './util/index'
|
||||||
import EventHandler from './dom/event-handler'
|
import EventHandler from './dom/event-handler'
|
||||||
import SelectorEngine from './dom/selector-engine'
|
import { SelectorEngine } from './dom/selector-engine'
|
||||||
import BaseComponent from './base-component'
|
import BaseComponent from './base-component'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+2
-2
@@ -5,9 +5,9 @@
|
|||||||
* --------------------------------------------------------------------------
|
* --------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { defineJQueryPlugin, getElementFromSelector, getNextActiveElement, isDisabled } from './util/index'
|
import { defineJQueryPlugin, getNextActiveElement, isDisabled } from './util/index'
|
||||||
import EventHandler from './dom/event-handler'
|
import EventHandler from './dom/event-handler'
|
||||||
import SelectorEngine from './dom/selector-engine'
|
import { getElementFromSelector, SelectorEngine } from './dom/selector-engine'
|
||||||
import BaseComponent from './base-component'
|
import BaseComponent from './base-component'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -6,7 +6,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import EventHandler from '../dom/event-handler'
|
import EventHandler from '../dom/event-handler'
|
||||||
import { getElementFromSelector, isDisabled } from './index'
|
import { isDisabled } from './index'
|
||||||
|
import { getElementFromSelector } from '../dom/selector-engine'
|
||||||
|
|
||||||
const enableDismissTrigger = (component, method = 'hide') => {
|
const enableDismissTrigger = (component, method = 'hide') => {
|
||||||
const clickEvent = `click.dismiss${component.EVENT_KEY}`
|
const clickEvent = `click.dismiss${component.EVENT_KEY}`
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import EventHandler from '../dom/event-handler'
|
import EventHandler from '../dom/event-handler'
|
||||||
import SelectorEngine from '../dom/selector-engine'
|
import { SelectorEngine } from '../dom/selector-engine'
|
||||||
import Config from './config'
|
import Config from './config'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -30,47 +30,6 @@ const getUID = prefix => {
|
|||||||
return prefix
|
return prefix
|
||||||
}
|
}
|
||||||
|
|
||||||
const getSelector = element => {
|
|
||||||
let selector = element.getAttribute('data-bs-target')
|
|
||||||
|
|
||||||
if (!selector || selector === '#') {
|
|
||||||
let hrefAttribute = element.getAttribute('href')
|
|
||||||
|
|
||||||
// The only valid content that could double as a selector are IDs or classes,
|
|
||||||
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
|
|
||||||
// `document.querySelector` will rightfully complain it is invalid.
|
|
||||||
// See https://github.com/twbs/bootstrap/issues/32273
|
|
||||||
if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
// Just in case some CMS puts out a full URL with the anchor appended
|
|
||||||
if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
|
|
||||||
hrefAttribute = `#${hrefAttribute.split('#')[1]}`
|
|
||||||
}
|
|
||||||
|
|
||||||
selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null
|
|
||||||
}
|
|
||||||
|
|
||||||
return selector
|
|
||||||
}
|
|
||||||
|
|
||||||
const getSelectorFromElement = element => {
|
|
||||||
const selector = getSelector(element)
|
|
||||||
|
|
||||||
if (selector) {
|
|
||||||
return document.querySelector(selector) ? selector : null
|
|
||||||
}
|
|
||||||
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
const getElementFromSelector = element => {
|
|
||||||
const selector = getSelector(element)
|
|
||||||
|
|
||||||
return selector ? document.querySelector(selector) : null
|
|
||||||
}
|
|
||||||
|
|
||||||
const getTransitionDurationFromElement = element => {
|
const getTransitionDurationFromElement = element => {
|
||||||
if (!element) {
|
if (!element) {
|
||||||
return 0
|
return 0
|
||||||
@@ -318,10 +277,8 @@ export {
|
|||||||
executeAfterTransition,
|
executeAfterTransition,
|
||||||
findShadowRoot,
|
findShadowRoot,
|
||||||
getElement,
|
getElement,
|
||||||
getElementFromSelector,
|
|
||||||
getjQuery,
|
getjQuery,
|
||||||
getNextActiveElement,
|
getNextActiveElement,
|
||||||
getSelectorFromElement,
|
|
||||||
getTransitionDurationFromElement,
|
getTransitionDurationFromElement,
|
||||||
getUID,
|
getUID,
|
||||||
isDisabled,
|
isDisabled,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* --------------------------------------------------------------------------
|
* --------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import SelectorEngine from '../dom/selector-engine'
|
import { SelectorEngine } from '../dom/selector-engine'
|
||||||
import Manipulator from '../dom/manipulator'
|
import Manipulator from '../dom/manipulator'
|
||||||
import { isElement } from './index'
|
import { isElement } from './index'
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
import { DefaultAllowlist, sanitizeHtml } from './sanitizer'
|
import { DefaultAllowlist, sanitizeHtml } from './sanitizer'
|
||||||
import { getElement, isElement } from '../util/index'
|
import { getElement, isElement } from '../util/index'
|
||||||
import SelectorEngine from '../dom/selector-engine'
|
import { SelectorEngine } from '../dom/selector-engine'
|
||||||
import Config from './config'
|
import Config from './config'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
import SelectorEngine from '../../../src/dom/selector-engine'
|
import {
|
||||||
import { getFixture, clearFixture } from '../../helpers/fixture'
|
getElementFromSelector,
|
||||||
|
getMultipleElementsFromSelector,
|
||||||
|
getSelectorFromElement,
|
||||||
|
SelectorEngine
|
||||||
|
} from '../../../src/dom/selector-engine'
|
||||||
|
import { clearFixture, getFixture } from '../../helpers/fixture'
|
||||||
|
|
||||||
describe('SelectorEngine', () => {
|
describe('SelectorEngine', () => {
|
||||||
let fixtureEl
|
let fixtureEl
|
||||||
@@ -232,5 +237,159 @@ describe('SelectorEngine', () => {
|
|||||||
expect(SelectorEngine.focusableChildren(fixtureEl)).toEqual(expectedElements)
|
expect(SelectorEngine.focusableChildren(fixtureEl)).toEqual(expectedElements)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
|
||||||
|
|
||||||
|
describe('getSelectorFromElement', () => {
|
||||||
|
it('should get selector from data-bs-target', () => {
|
||||||
|
fixtureEl.innerHTML = [
|
||||||
|
'<div id="test" data-bs-target=".target"></div>',
|
||||||
|
'<div class="target"></div>'
|
||||||
|
].join('')
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('#test')
|
||||||
|
|
||||||
|
expect(getSelectorFromElement(testEl)).toEqual('.target')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should get selector from href if no data-bs-target set', () => {
|
||||||
|
fixtureEl.innerHTML = [
|
||||||
|
'<a id="test" href=".target"></a>',
|
||||||
|
'<div class="target"></div>'
|
||||||
|
].join('')
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('#test')
|
||||||
|
|
||||||
|
expect(getSelectorFromElement(testEl)).toEqual('.target')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should get selector from href if data-bs-target equal to #', () => {
|
||||||
|
fixtureEl.innerHTML = [
|
||||||
|
'<a id="test" data-bs-target="#" href=".target"></a>',
|
||||||
|
'<div class="target"></div>'
|
||||||
|
].join('')
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('#test')
|
||||||
|
|
||||||
|
expect(getSelectorFromElement(testEl)).toEqual('.target')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return null if a selector from a href is a url without an anchor', () => {
|
||||||
|
fixtureEl.innerHTML = [
|
||||||
|
'<a id="test" data-bs-target="#" href="foo/bar.html"></a>',
|
||||||
|
'<div class="target"></div>'
|
||||||
|
].join('')
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('#test')
|
||||||
|
|
||||||
|
expect(getSelectorFromElement(testEl)).toBeNull()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return the anchor if a selector from a href is a url', () => {
|
||||||
|
fixtureEl.innerHTML = [
|
||||||
|
'<a id="test" data-bs-target="#" href="foo/bar.html#target"></a>',
|
||||||
|
'<div id="target"></div>'
|
||||||
|
].join('')
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('#test')
|
||||||
|
|
||||||
|
expect(getSelectorFromElement(testEl)).toEqual('#target')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return null if selector not found', () => {
|
||||||
|
fixtureEl.innerHTML = '<a id="test" href=".target"></a>'
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('#test')
|
||||||
|
|
||||||
|
expect(getSelectorFromElement(testEl)).toBeNull()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return null if no selector', () => {
|
||||||
|
fixtureEl.innerHTML = '<div></div>'
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('div')
|
||||||
|
|
||||||
|
expect(getSelectorFromElement(testEl)).toBeNull()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('getElementFromSelector', () => {
|
||||||
|
it('should get element from data-bs-target', () => {
|
||||||
|
fixtureEl.innerHTML = [
|
||||||
|
'<div id="test" data-bs-target=".target"></div>',
|
||||||
|
'<div class="target"></div>'
|
||||||
|
].join('')
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('#test')
|
||||||
|
|
||||||
|
expect(getElementFromSelector(testEl)).toEqual(fixtureEl.querySelector('.target'))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should get element from href if no data-bs-target set', () => {
|
||||||
|
fixtureEl.innerHTML = [
|
||||||
|
'<a id="test" href=".target"></a>',
|
||||||
|
'<div class="target"></div>'
|
||||||
|
].join('')
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('#test')
|
||||||
|
|
||||||
|
expect(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(getElementFromSelector(testEl)).toBeNull()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return null if no selector', () => {
|
||||||
|
fixtureEl.innerHTML = '<div></div>'
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('div')
|
||||||
|
|
||||||
|
expect(getElementFromSelector(testEl)).toBeNull()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('getMultipleElementsFromSelector', () => {
|
||||||
|
it('should get elements from data-bs-target', () => {
|
||||||
|
fixtureEl.innerHTML = [
|
||||||
|
'<div id="test" data-bs-target=".target"></div>',
|
||||||
|
'<div class="target"></div>',
|
||||||
|
'<div class="target"></div>'
|
||||||
|
].join('')
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('#test')
|
||||||
|
|
||||||
|
expect(getMultipleElementsFromSelector(testEl)).toEqual(Array.from(fixtureEl.querySelectorAll('.target')))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should get elements in array, from href if no data-bs-target set', () => {
|
||||||
|
fixtureEl.innerHTML = [
|
||||||
|
'<a id="test" href=".target"></a>',
|
||||||
|
'<div class="target"></div>',
|
||||||
|
'<div class="target"></div>'
|
||||||
|
].join('')
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('#test')
|
||||||
|
|
||||||
|
expect(getMultipleElementsFromSelector(testEl)).toEqual(Array.from(fixtureEl.querySelectorAll('.target')))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return empty array if elements not found', () => {
|
||||||
|
fixtureEl.innerHTML = '<a id="test" href=".target"></a>'
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('#test')
|
||||||
|
|
||||||
|
expect(getMultipleElementsFromSelector(testEl)).toHaveSize(0)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return empty array if no selector', () => {
|
||||||
|
fixtureEl.innerHTML = '<div></div>'
|
||||||
|
|
||||||
|
const testEl = fixtureEl.querySelector('div')
|
||||||
|
|
||||||
|
expect(getMultipleElementsFromSelector(testEl)).toHaveSize(0)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import FocusTrap from '../../../src/util/focustrap'
|
import FocusTrap from '../../../src/util/focustrap'
|
||||||
import EventHandler from '../../../src/dom/event-handler'
|
import EventHandler from '../../../src/dom/event-handler'
|
||||||
import SelectorEngine from '../../../src/dom/selector-engine'
|
import { SelectorEngine } from '../../../src/dom/selector-engine'
|
||||||
import { clearFixture, createEvent, getFixture } from '../../helpers/fixture'
|
import { clearFixture, createEvent, getFixture } from '../../helpers/fixture'
|
||||||
|
|
||||||
describe('FocusTrap', () => {
|
describe('FocusTrap', () => {
|
||||||
|
|||||||
@@ -22,119 +22,6 @@ describe('Util', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('getSelectorFromElement', () => {
|
|
||||||
it('should get selector from data-bs-target', () => {
|
|
||||||
fixtureEl.innerHTML = [
|
|
||||||
'<div id="test" data-bs-target=".target"></div>',
|
|
||||||
'<div class="target"></div>'
|
|
||||||
].join('')
|
|
||||||
|
|
||||||
const testEl = fixtureEl.querySelector('#test')
|
|
||||||
|
|
||||||
expect(Util.getSelectorFromElement(testEl)).toEqual('.target')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should get selector from href if no data-bs-target set', () => {
|
|
||||||
fixtureEl.innerHTML = [
|
|
||||||
'<a id="test" href=".target"></a>',
|
|
||||||
'<div class="target"></div>'
|
|
||||||
].join('')
|
|
||||||
|
|
||||||
const testEl = fixtureEl.querySelector('#test')
|
|
||||||
|
|
||||||
expect(Util.getSelectorFromElement(testEl)).toEqual('.target')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should get selector from href if data-bs-target equal to #', () => {
|
|
||||||
fixtureEl.innerHTML = [
|
|
||||||
'<a id="test" data-bs-target="#" href=".target"></a>',
|
|
||||||
'<div class="target"></div>'
|
|
||||||
].join('')
|
|
||||||
|
|
||||||
const testEl = fixtureEl.querySelector('#test')
|
|
||||||
|
|
||||||
expect(Util.getSelectorFromElement(testEl)).toEqual('.target')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should return null if a selector from a href is a url without an anchor', () => {
|
|
||||||
fixtureEl.innerHTML = [
|
|
||||||
'<a id="test" data-bs-target="#" href="foo/bar.html"></a>',
|
|
||||||
'<div class="target"></div>'
|
|
||||||
].join('')
|
|
||||||
|
|
||||||
const testEl = fixtureEl.querySelector('#test')
|
|
||||||
|
|
||||||
expect(Util.getSelectorFromElement(testEl)).toBeNull()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should return the anchor if a selector from a href is a url', () => {
|
|
||||||
fixtureEl.innerHTML = [
|
|
||||||
'<a id="test" data-bs-target="#" href="foo/bar.html#target"></a>',
|
|
||||||
'<div id="target"></div>'
|
|
||||||
].join('')
|
|
||||||
|
|
||||||
const testEl = fixtureEl.querySelector('#test')
|
|
||||||
|
|
||||||
expect(Util.getSelectorFromElement(testEl)).toEqual('#target')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should return null if selector not found', () => {
|
|
||||||
fixtureEl.innerHTML = '<a id="test" href=".target"></a>'
|
|
||||||
|
|
||||||
const testEl = fixtureEl.querySelector('#test')
|
|
||||||
|
|
||||||
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-bs-target', () => {
|
|
||||||
fixtureEl.innerHTML = [
|
|
||||||
'<div id="test" data-bs-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-bs-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', () => {
|
describe('getTransitionDurationFromElement', () => {
|
||||||
it('should get transition from element', () => {
|
it('should get transition from element', () => {
|
||||||
fixtureEl.innerHTML = '<div style="transition: all 300ms ease-out;"></div>'
|
fixtureEl.innerHTML = '<div style="transition: all 300ms ease-out;"></div>'
|
||||||
|
|||||||
Reference in New Issue
Block a user