From fcdfee90b3a181573ad6d7aeb13aa481b11f2ef5 Mon Sep 17 00:00:00 2001 From: GeoSot Date: Mon, 7 Nov 2022 14:55:34 +0200 Subject: ref: refactor `getSelector` not to be exported (#37438) --- js/src/dom/selector-engine.js | 59 ++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/js/src/dom/selector-engine.js b/js/src/dom/selector-engine.js index 248dab4944..88d4c86ea0 100644 --- a/js/src/dom/selector-engine.js +++ b/js/src/dom/selector-engine.js @@ -7,9 +7,30 @@ import { isDisabled, isVisible, parseSelector } from '../util/index.js' -/** - * Constants - */ +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 parseSelector(selector) +} const SelectorEngine = { find(selector, element = document.documentElement) { @@ -79,34 +100,8 @@ const SelectorEngine = { return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el)) }, - 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 - selector = parseSelector(selector) - } - - return selector - }, - getSelectorFromElement(element) { - const selector = SelectorEngine.getSelector(element) + const selector = getSelector(element) if (selector) { return SelectorEngine.findOne(selector) ? selector : null @@ -116,13 +111,13 @@ const SelectorEngine = { }, getElementFromSelector(element) { - const selector = SelectorEngine.getSelector(element) + const selector = getSelector(element) return selector ? SelectorEngine.findOne(selector) : null }, getMultipleElementsFromSelector(element) { - const selector = SelectorEngine.getSelector(element) + const selector = getSelector(element) return selector ? SelectorEngine.find(selector) : [] } -- cgit v1.2.3