0
0
mirror of https://github.com/twbs/bootstrap.git synced 2025-02-26 23:54:23 +01:00

Switch to using for...of

This commit is contained in:
XhmikosR 2024-03-07 22:02:17 +02:00
parent 8590295993
commit 958cdec31b
17 changed files with 109 additions and 108 deletions

View File

@ -164,8 +164,7 @@
}, },
"rules": { "rules": {
"no-console": "off", "no-console": "off",
"no-new": "off", "no-new": "off"
"unicorn/no-array-for-each": "off"
} }
}, },
{ {
@ -192,8 +191,7 @@
"ecmaVersion": 2019 "ecmaVersion": 2019
}, },
"rules": { "rules": {
"no-new": "off", "no-new": "off"
"unicorn/no-array-for-each": "off"
} }
}, },
{ {

View File

@ -217,9 +217,13 @@
} }
} }
document.querySelectorAll('[data-bs-toggle="popover"]').forEach(popoverEl => new bootstrap.Popover(popoverEl)) for (const popoverEl of document.querySelectorAll('[data-bs-toggle="popover"]')) {
new bootstrap.Popover(popoverEl)
}
document.querySelectorAll('[data-bs-toggle="tooltip"]').forEach(tooltipEl => new bootstrap.Tooltip(tooltipEl)) for (const tooltipEl of document.querySelectorAll('[data-bs-toggle="tooltip"]')) {
new bootstrap.Tooltip(tooltipEl)
}
const tall = document.getElementById('tall') const tall = document.getElementById('tall')
document.getElementById('tall-toggle').addEventListener('click', () => { document.getElementById('tall-toggle').addEventListener('click', () => {

View File

@ -35,7 +35,9 @@
<script> <script>
/* global bootstrap: false */ /* global bootstrap: false */
document.querySelectorAll('[data-bs-toggle="popover"]').forEach(popoverEl => new bootstrap.Popover(popoverEl)) for (const popoverEl of document.querySelectorAll('[data-bs-toggle="popover"]')) {
new bootstrap.Popover(popoverEl)
}
</script> </script>
</body> </body>
</html> </html>

View File

@ -55,14 +55,20 @@
/* global bootstrap: false */ /* global bootstrap: false */
window.addEventListener('load', () => { window.addEventListener('load', () => {
document.querySelectorAll('.toast').forEach(toastEl => new bootstrap.Toast(toastEl)) for (const toastEl of document.querySelectorAll('.toast')) {
new bootstrap.Toast(toastEl)
}
document.getElementById('btnShowToast').addEventListener('click', () => { document.getElementById('btnShowToast').addEventListener('click', () => {
document.querySelectorAll('.toast').forEach(toastEl => bootstrap.Toast.getInstance(toastEl).show()) for (const toastEl of document.querySelectorAll('.toast')) {
bootstrap.Toast.getInstance(toastEl).show()
}
}) })
document.getElementById('btnHideToast').addEventListener('click', () => { document.getElementById('btnHideToast').addEventListener('click', () => {
document.querySelectorAll('.toast').forEach(toastEl => bootstrap.Toast.getInstance(toastEl).hide()) for (const toastEl of document.querySelectorAll('.toast')) {
bootstrap.Toast.getInstance(toastEl).hide()
}
}) })
}) })
</script> </script>

View File

@ -113,7 +113,9 @@
}) })
targetTooltip.show() targetTooltip.show()
document.querySelectorAll('[data-bs-toggle="tooltip"]').forEach(tooltipEl => new bootstrap.Tooltip(tooltipEl)) for (const tooltipEl of document.querySelectorAll('[data-bs-toggle="tooltip"]')) {
new bootstrap.Tooltip(tooltipEl)
}
</script> </script>
<script> <script>

View File

@ -29,14 +29,13 @@
].join('') ].join('')
// Wrap programmatically code blocks and add copy btn. // Wrap programmatically code blocks and add copy btn.
document.querySelectorAll('.highlight') for (const element of document.querySelectorAll('.highlight')) {
.forEach(element => {
// Ignore examples made by shortcode // Ignore examples made by shortcode
if (!element.closest('.bd-example-snippet')) { if (!element.closest('.bd-example-snippet')) {
element.insertAdjacentHTML('beforebegin', btnHtml) element.insertAdjacentHTML('beforebegin', btnHtml)
element.previousElementSibling.append(element) element.previousElementSibling.append(element)
} }
}) }
/** /**
* *
@ -44,9 +43,9 @@
* @param {string} title * @param {string} title
*/ */
function snippetButtonTooltip(selector, title) { function snippetButtonTooltip(selector, title) {
document.querySelectorAll(selector).forEach(btn => { for (const btn of document.querySelectorAll(selector)) {
bootstrap.Tooltip.getOrCreateInstance(btn, { title }) bootstrap.Tooltip.getOrCreateInstance(btn, { title })
}) }
} }
snippetButtonTooltip('.btn-clipboard', btnTitle) snippetButtonTooltip('.btn-clipboard', btnTitle)

View File

@ -20,19 +20,17 @@
// Tooltips // Tooltips
// -------- // --------
// Instantiate all tooltips in a docs or StackBlitz // Instantiate all tooltips in a docs or StackBlitz
document.querySelectorAll('[data-bs-toggle="tooltip"]') for (const tooltip of document.querySelectorAll('[data-bs-toggle="tooltip"]')) {
.forEach(tooltip => {
new bootstrap.Tooltip(tooltip) new bootstrap.Tooltip(tooltip)
}) }
// -------- // --------
// Popovers // Popovers
// -------- // --------
// Instantiate all popovers in docs or StackBlitz // Instantiate all popovers in docs or StackBlitz
document.querySelectorAll('[data-bs-toggle="popover"]') for (const popover of document.querySelectorAll('[data-bs-toggle="popover"]')) {
.forEach(popover => {
new bootstrap.Popover(popover) new bootstrap.Popover(popover)
}) }
// ------------------------------- // -------------------------------
// Toasts // Toasts
@ -50,14 +48,13 @@
} }
// Instantiate all toasts in docs pages only // Instantiate all toasts in docs pages only
document.querySelectorAll('.bd-example .toast') for (const toastNode of document.querySelectorAll('.bd-example .toast')) {
.forEach(toastNode => {
const toast = new bootstrap.Toast(toastNode, { const toast = new bootstrap.Toast(toastNode, {
autohide: false autohide: false
}) })
toast.show() toast.show()
}) }
// Instantiate all toasts in docs pages only // Instantiate all toasts in docs pages only
// js-docs-start live-toast // js-docs-start live-toast
@ -103,32 +100,29 @@
// Carousels // Carousels
// -------- // --------
// Instantiate all non-autoplaying carousels in docs or StackBlitz // Instantiate all non-autoplaying carousels in docs or StackBlitz
document.querySelectorAll('.carousel:not([data-bs-ride="carousel"])') for (const carousel of document.querySelectorAll('.carousel:not([data-bs-ride="carousel"])')) {
.forEach(carousel => {
bootstrap.Carousel.getOrCreateInstance(carousel) bootstrap.Carousel.getOrCreateInstance(carousel)
}) }
// ------------------------------- // -------------------------------
// Checks & Radios // Checks & Radios
// ------------------------------- // -------------------------------
// Indeterminate checkbox example in docs and StackBlitz // Indeterminate checkbox example in docs and StackBlitz
document.querySelectorAll('.bd-example-indeterminate [type="checkbox"]') for (const checkbox of document.querySelectorAll('.bd-example-indeterminate [type="checkbox"]')) {
.forEach(checkbox => {
if (checkbox.id.includes('Indeterminate')) { if (checkbox.id.includes('Indeterminate')) {
checkbox.indeterminate = true checkbox.indeterminate = true
} }
}) }
// ------------------------------- // -------------------------------
// Links // Links
// ------------------------------- // -------------------------------
// Disable empty links in docs examples only // Disable empty links in docs examples only
document.querySelectorAll('.bd-content [href="#"]') for (const link of document.querySelectorAll('.bd-content [href="#"]')) {
.forEach(link => {
link.addEventListener('click', event => { link.addEventListener('click', event => {
event.preventDefault() event.preventDefault()
}) })
}) }
// ------------------------------- // -------------------------------
// Modal // Modal
@ -161,10 +155,10 @@
// 'Offcanvas components' example in docs only // 'Offcanvas components' example in docs only
const myOffcanvas = document.querySelectorAll('.bd-example-offcanvas .offcanvas') const myOffcanvas = document.querySelectorAll('.bd-example-offcanvas .offcanvas')
if (myOffcanvas) { if (myOffcanvas) {
myOffcanvas.forEach(offcanvas => { for (const offcanvas of myOffcanvas) {
offcanvas.addEventListener('show.bs.offcanvas', event => { offcanvas.addEventListener('show.bs.offcanvas', event => {
event.preventDefault() event.preventDefault()
}, false) }, false)
}) }
} }
})() })()

View File

@ -223,10 +223,10 @@ const bsButton = new bootstrap.Button('#myButton')
For example, to toggle all buttons For example, to toggle all buttons
```js ```js
document.querySelectorAll('.btn').forEach(buttonElement => { for (const buttonElement of document.querySelectorAll('.btn')) {
const button = bootstrap.Button.getOrCreateInstance(buttonElement) const button = bootstrap.Button.getOrCreateInstance(buttonElement)
button.toggle() button.toggle()
}) }
``` ```
## CSS ## CSS

View File

@ -413,14 +413,14 @@ Enable tabbable list item via JavaScript (each list item needs to be activated i
```js ```js
const triggerTabList = document.querySelectorAll('#myTab a') const triggerTabList = document.querySelectorAll('#myTab a')
triggerTabList.forEach(triggerEl => { for (const triggerEl of triggerTabList) {
const tabTrigger = new bootstrap.Tab(triggerEl) const tabTrigger = new bootstrap.Tab(triggerEl)
triggerEl.addEventListener('click', event => { triggerEl.addEventListener('click', event => {
event.preventDefault() event.preventDefault()
tabTrigger.show() tabTrigger.show()
}) })
}) }
``` ```
You can activate individual list item in several ways: You can activate individual list item in several ways:
@ -491,10 +491,10 @@ If no tab was already active, then the `hide.bs.tab` and `hidden.bs.tab` events
```js ```js
const tabElms = document.querySelectorAll('a[data-bs-toggle="list"]') const tabElms = document.querySelectorAll('a[data-bs-toggle="list"]')
tabElms.forEach(tabElm => { for (const tabElm of tabElms) {
tabElm.addEventListener('shown.bs.tab', event => { tabElm.addEventListener('shown.bs.tab', event => {
event.target // newly activated tab event.target // newly activated tab
event.relatedTarget // previous active tab event.relatedTarget // previous active tab
}) })
}) }
``` ```

View File

@ -613,14 +613,14 @@ Enable tabbable tabs via JavaScript (each tab needs to be activated individually
```js ```js
const triggerTabList = document.querySelectorAll('#myTab button') const triggerTabList = document.querySelectorAll('#myTab button')
triggerTabList.forEach(triggerEl => { for (const triggerEl of triggerTabList) {
const tabTrigger = new bootstrap.Tab(triggerEl) const tabTrigger = new bootstrap.Tab(triggerEl)
triggerEl.addEventListener('click', event => { triggerEl.addEventListener('click', event => {
event.preventDefault() event.preventDefault()
tabTrigger.show() tabTrigger.show()
}) })
}) }
``` ```
You can activate individual tabs in several ways: You can activate individual tabs in several ways:

View File

@ -333,13 +333,13 @@ Scrollspy is not limited to nav components and list groups, so it will work on a
Target elements that arent visible will be ignored and their corresponding nav items won't receive an `.active` class. Scrollspy instances initialized in a non-visible wrapper will ignore all target elements. Use the `refresh` method to check for observable elements once the wrapper becomes visible. Target elements that arent visible will be ignored and their corresponding nav items won't receive an `.active` class. Scrollspy instances initialized in a non-visible wrapper will ignore all target elements. Use the `refresh` method to check for observable elements once the wrapper becomes visible.
```js ```js
document.querySelectorAll('#nav-tab>[data-bs-toggle="tab"]').forEach(el => { for (const el of document.querySelectorAll('#nav-tab > [data-bs-toggle="tab"]')) {
el.addEventListener('shown.bs.tab', () => { el.addEventListener('shown.bs.tab', () => {
const target = el.getAttribute('data-bs-target') const target = el.getAttribute('data-bs-target')
const scrollElem = document.querySelector(`${target} [data-bs-spy="scroll"]`) const scrollElem = document.querySelector(`${target} [data-bs-spy="scroll"]`)
bootstrap.ScrollSpy.getOrCreateInstance(scrollElem).refresh() bootstrap.ScrollSpy.getOrCreateInstance(scrollElem).refresh()
}) })
}) }
``` ```
## Usage ## Usage
@ -406,9 +406,9 @@ Here's an example using the refresh method:
```js ```js
const dataSpyList = document.querySelectorAll('[data-bs-spy="scroll"]') const dataSpyList = document.querySelectorAll('[data-bs-spy="scroll"]')
dataSpyList.forEach(dataSpyEl => { for (const dataSpyEl of dataSpyList) {
bootstrap.ScrollSpy.getInstance(dataSpyEl).refresh() bootstrap.ScrollSpy.getInstance(dataSpyEl).refresh()
}) }
``` ```
### Events ### Events

View File

@ -4,34 +4,30 @@
'use strict' 'use strict'
// Tooltip and popover demos // Tooltip and popover demos
document.querySelectorAll('.tooltip-demo') for (const tooltip of document.querySelectorAll('.tooltip-demo')) {
.forEach(tooltip => {
new bootstrap.Tooltip(tooltip, { new bootstrap.Tooltip(tooltip, {
selector: '[data-bs-toggle="tooltip"]' selector: '[data-bs-toggle="tooltip"]'
}) })
}) }
document.querySelectorAll('[data-bs-toggle="popover"]') for (const popover of document.querySelectorAll('[data-bs-toggle="popover"]')) {
.forEach(popover => {
new bootstrap.Popover(popover) new bootstrap.Popover(popover)
}) }
document.querySelectorAll('.toast') for (const toastNode of document.querySelectorAll('.toast')) {
.forEach(toastNode => {
const toast = new bootstrap.Toast(toastNode, { const toast = new bootstrap.Toast(toastNode, {
autohide: false autohide: false
}) })
toast.show() toast.show()
}) }
// Disable empty links and submit buttons // Disable empty links and submit buttons
document.querySelectorAll('[href="#"], [type="submit"]') for (const link of document.querySelectorAll('[href="#"], [type="submit"]')) {
.forEach(link => {
link.addEventListener('click', event => { link.addEventListener('click', event => {
event.preventDefault() event.preventDefault()
}) })
}) }
function setActiveItem() { function setActiveItem() {
const { hash } = window.location const { hash } = window.location

View File

@ -3,10 +3,10 @@
'use strict' 'use strict'
// Fetch all the forms we want to apply custom Bootstrap validation styles to // Fetch all the forms we want to apply custom Bootstrap validation styles to
const forms = document.querySelectorAll('.needs-validation'); const forms = document.querySelectorAll('.needs-validation')
// Loop over them and prevent submission // Loop over them and prevent submission
[...forms].forEach(form => { for (const form of forms) {
form.addEventListener('submit', event => { form.addEventListener('submit', event => {
if (!form.checkValidity()) { if (!form.checkValidity()) {
event.preventDefault() event.preventDefault()
@ -15,5 +15,5 @@
form.classList.add('was-validated') form.classList.add('was-validated')
}, false) }, false)
}) }
})() })()

View File

@ -2,7 +2,7 @@
(() => { (() => {
'use strict' 'use strict'
const tooltipTriggerList = [...document.querySelectorAll('[data-bs-toggle="tooltip"]')] const tooltipTriggerList = [...document.querySelectorAll('[data-bs-toggle="tooltip"]')]
tooltipTriggerList.forEach(tooltipTriggerEl => { for (const tooltipTriggerEl of tooltipTriggerList) {
new bootstrap.Tooltip(tooltipTriggerEl) new bootstrap.Tooltip(tooltipTriggerEl)
}) }
})() })()

View File

@ -39,8 +39,9 @@ We provide a version of Bootstrap built as `ESM` (`bootstrap.esm.js` and `bootst
<script type="module"> <script type="module">
import { Toast } from 'bootstrap.esm.min.js' import { Toast } from 'bootstrap.esm.min.js'
Array.from(document.querySelectorAll('.toast')) for (const toastNode of document.querySelectorAll('.toast')) {
.forEach(toastNode => new Toast(toastNode)) new Toast(toastNode))
}
</script> </script>
``` ```

View File

@ -41,10 +41,10 @@
const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`) const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`)
const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href') const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href')
document.querySelectorAll('[data-bs-theme-value]').forEach(element => { for (const element of document.querySelectorAll('[data-bs-theme-value]')) {
element.classList.remove('active') element.classList.remove('active')
element.setAttribute('aria-pressed', 'false') element.setAttribute('aria-pressed', 'false')
}) }
btnToActive.classList.add('active') btnToActive.classList.add('active')
btnToActive.setAttribute('aria-pressed', 'true') btnToActive.setAttribute('aria-pressed', 'true')
@ -67,14 +67,13 @@
window.addEventListener('DOMContentLoaded', () => { window.addEventListener('DOMContentLoaded', () => {
showActiveTheme(getPreferredTheme()) showActiveTheme(getPreferredTheme())
document.querySelectorAll('[data-bs-theme-value]') for (const toggle of document.querySelectorAll('[data-bs-theme-value]')) {
.forEach(toggle => {
toggle.addEventListener('click', () => { toggle.addEventListener('click', () => {
const theme = toggle.getAttribute('data-bs-theme-value') const theme = toggle.getAttribute('data-bs-theme-value')
setStoredTheme(theme) setStoredTheme(theme)
setTheme(theme) setTheme(theme)
showActiveTheme(theme, true) showActiveTheme(theme, true)
}) })
}) }
}) })
})() })()

View File

@ -3,10 +3,10 @@
'use strict' 'use strict'
// Fetch all the forms we want to apply custom Bootstrap validation styles to // Fetch all the forms we want to apply custom Bootstrap validation styles to
const forms = document.querySelectorAll('.needs-validation'); const forms = document.querySelectorAll('.needs-validation')
// Loop over them and prevent submission // Loop over them and prevent submission
[...forms].forEach(form => { for (const form of forms) {
form.addEventListener('submit', event => { form.addEventListener('submit', event => {
if (!form.checkValidity()) { if (!form.checkValidity()) {
event.preventDefault() event.preventDefault()
@ -15,5 +15,5 @@
form.classList.add('was-validated') form.classList.add('was-validated')
}, false) }, false)
}) }
})() })()