Spaces:
Running
Running
/** | |
* -------------------------------------------------------------------------- | |
* Bootstrap (v5.1.3): dom/selector-engine.js | |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) | |
* -------------------------------------------------------------------------- | |
*/ | |
/** | |
* ------------------------------------------------------------------------ | |
* Constants | |
* ------------------------------------------------------------------------ | |
*/ | |
import { | |
isDisabled, | |
isVisible | |
} from '../util/index' | |
const NODE_TEXT = 3 | |
const SelectorEngine = { | |
find(selector, element = document.documentElement) { | |
return [].concat(...Element.prototype.querySelectorAll.call(element, selector)) | |
}, | |
findOne(selector, element = document.documentElement) { | |
return Element.prototype.querySelector.call(element, selector) | |
}, | |
children(element, selector) { | |
return [].concat(...element.children) | |
.filter(child => child.matches(selector)) | |
}, | |
parents(element, selector) { | |
const parents = [] | |
let ancestor = element.parentNode | |
while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) { | |
if (ancestor.matches(selector)) { | |
parents.push(ancestor) | |
} | |
ancestor = ancestor.parentNode | |
} | |
return parents | |
}, | |
prev(element, selector) { | |
let previous = element.previousElementSibling | |
while (previous) { | |
if (previous.matches(selector)) { | |
return [previous] | |
} | |
previous = previous.previousElementSibling | |
} | |
return [] | |
}, | |
next(element, selector) { | |
let next = element.nextElementSibling | |
while (next) { | |
if (next.matches(selector)) { | |
return [next] | |
} | |
next = next.nextElementSibling | |
} | |
return [] | |
}, | |
focusableChildren(element) { | |
const focusables = [ | |
'a', | |
'button', | |
'input', | |
'textarea', | |
'select', | |
'details', | |
'[tabindex]', | |
'[contenteditable="true"]' | |
].map(selector => `${selector}:not([tabindex^="-"])`).join(', ') | |
return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el)) | |
} | |
} | |
export default SelectorEngine |