JavaScript
Breng Bootstrap tot leven met onze optionele JavaScript-plug-ins. Lees meer over elke plug-in, onze gegevens en programmatische API-opties en meer.
Individueel of samengesteld
Plug-ins kunnen afzonderlijk worden opgenomen (met behulp van Bootstrap's individual js/dist/*.js
), of allemaal tegelijk met bootstrap.js
of de verkleinde bootstrap.min.js
(gebruik niet beide).
Als u een bundelaar gebruikt (Webpack, Parcel, Vite…), kunt u /js/dist/*.js
bestanden gebruiken die UMD-ready zijn.
Gebruik met JavaScript-frameworks
Hoewel de Bootstrap CSS met elk framework kan worden gebruikt, is Bootstrap JavaScript niet volledig compatibel met JavaScript-frameworks zoals React, Vue en Angular die volledige kennis van de DOM veronderstellen. Zowel Bootstrap als het framework kunnen proberen hetzelfde DOM-element te muteren, wat resulteert in bugs zoals dropdowns die vastzitten in de "open" positie.
Een beter alternatief voor degenen die dit type frameworks gebruiken, is om een framework-specifiek pakket te gebruiken in plaats van het Bootstrap JavaScript. Hier zijn enkele van de meest populaire opties:
- Reageren: Reageren Bootstrap
- Vue: BootstrapVue (ondersteunt momenteel alleen Vue 2 en Bootstrap 4)
- Hoekig: ng-bootstrap
Bootstrap als module gebruiken
We bieden een versie van Bootstrap gebouwd als ESM
( bootstrap.esm.js
en bootstrap.esm.min.js
) waarmee u Bootstrap als een module in de browser kunt gebruiken, als uw beoogde browsers dit ondersteunen .
<script type="module">
import { Toast } from 'bootstrap.esm.min.js'
Array.from(document.querySelectorAll('.toast'))
.forEach(toastNode => new Toast(toastNode))
</script>
In vergelijking met JS-bundelaars, vereist het gebruik van ESM in de browser dat u het volledige pad en de bestandsnaam gebruikt in plaats van de modulenaam. Lees meer over JS-modules in de browser. Daarom gebruiken we in 'bootstrap.esm.min.js'
plaats van 'bootstrap'
hierboven. Dit wordt echter verder bemoeilijkt door onze Popper-afhankelijkheid, die Popper als volgt in ons JavaScript importeert:
import * as Popper from "@popperjs/core"
Als u dit ongewijzigd probeert, ziet u een fout in de console zoals de volgende:
Uncaught TypeError: Failed to resolve module specifier "@popperjs/core". Relative references must start with either "/", "./", or "../".
Om dit op te lossen, kunt u an importmap
gebruiken om de willekeurige modulenamen om te zetten in volledige paden. Als uw beoogde browsers , niet ondersteunen importmap
, moet u het es-module-shims- project gebruiken. Zo werkt het voor Bootstrap en Popper:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-iYQeCzEYFbKjA/T2uDLTpkwGzCiq6soy8tYaI1GyVh/UjpbCx/TYkiZhlZB6+fzT" crossorigin="anonymous">
<title>Hello, modularity!</title>
</head>
<body>
<h1>Hello, modularity!</h1>
<button id="popoverButton" type="button" class="btn btn-primary btn-lg" class="btn btn-lg btn-danger" data-bs-toggle="popover" title="ESM in Browser" data-bs-content="Bang!">Custom popover</button>
<script async src="https://cdn.jsdelivr.net/npm/es-module-shims@1/dist/es-module-shims.min.js" crossorigin="anonymous"></script>
<script type="importmap">
{
"imports": {
"@popperjs/core": "https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js",
"bootstrap": "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.esm.min.js"
}
}
</script>
<script type="module">
import * as bootstrap from 'bootstrap'
new bootstrap.Popover(document.getElementById('popoverButton'))
</script>
</body>
</html>
afhankelijkheden
Sommige plug-ins en CSS-componenten zijn afhankelijk van andere plug-ins. Als u plug-ins afzonderlijk opneemt, moet u controleren op deze afhankelijkheden in de documenten.
Onze dropdowns, popovers en tooltips zijn ook afhankelijk van Popper .
Gegevenskenmerken
Bijna alle Bootstrap-plug-ins kunnen alleen via HTML worden ingeschakeld en geconfigureerd met gegevensattributen (onze voorkeursmanier om JavaScript-functionaliteit te gebruiken). Zorg ervoor dat u slechts één set gegevensattributen voor een enkel element gebruikt (u kunt bijvoorbeeld geen tooltip en modaal activeren vanaf dezelfde knop.)
Omdat opties kunnen worden doorgegeven via gegevensattributen of JavaScript, kunt u een optienaam toevoegen aan data-bs-
, zoals in data-bs-animation="{value}"
. Zorg ervoor dat u het kasttype van de optienaam wijzigt van " camelCase " in " kebab-case " wanneer u de opties doorgeeft via gegevensattributen. Gebruik bijvoorbeeld in data-bs-custom-class="beautifier"
plaats van data-bs-customClass="beautifier"
.
Vanaf Bootstrap 5.2.0 ondersteunen alle componenten een experimenteel gereserveerd gegevenskenmerk data-bs-config
dat een eenvoudige componentconfiguratie als een JSON-tekenreeks kan bevatten. Wanneer een element attributen heeft data-bs-config='{"delay":0, "title":123}'
, zal data-bs-title="456"
de uiteindelijke title
waarde zijn 456
en zullen de afzonderlijke gegevensattributen de waarden overschrijven die op data-bs-config
. Bovendien kunnen bestaande gegevensattributen JSON-waarden zoals data-bs-delay='{"show":0,"hide":150}'
.
Selectors
We gebruiken de native querySelector
en querySelectorAll
methoden om DOM-elementen op te vragen om prestatieredenen, dus u moet geldige selectors gebruiken . Als u speciale selectors zoals collapse:Example
gebruikt, zorg er dan voor dat u ze ontwijkt.
Evenementen
Bootstrap biedt aangepaste gebeurtenissen voor de unieke acties van de meeste plug-ins. Over het algemeen komen deze in een infinitief en voltooid deelwoordvorm - waarbij de infinitief (bijv. show
) wordt geactiveerd aan het begin van een gebeurtenis, en de voltooid deelwoordvorm (bijv. shown
) wordt geactiveerd bij de voltooiing van een actie.
Alle oneindige gebeurtenissen bieden preventDefault()
functionaliteit. Dit biedt de mogelijkheid om de uitvoering van een actie te stoppen voordat deze begint. False retourneren van een gebeurtenishandler zal ook automatisch aanroepen preventDefault()
.
const myModal = document.querySelector('#myModal')
myModal.addEventListener('show.bs.modal', event => {
if (!data) {
return event.preventDefault() // stops modal from being shown
}
})
Programmatische API
Alle constructors accepteren een optioneel options-object of niets (dat een plug-in start met zijn standaardgedrag):
const myModalEl = document.querySelector('#myModal')
const modal = new bootstrap.Modal(myModalEl) // initialized with defaults
const configObject = { keyboard: false }
const modal1 = new bootstrap.Modal(myModalEl, configObject) // initialized with no keyboard
Als u een bepaalde plug-in-instantie wilt krijgen, onthult elke plug-in een getInstance
methode. Om bijvoorbeeld een instantie rechtstreeks uit een element op te halen:
bootstrap.Popover.getInstance(myPopoverEl)
Deze methode keert terug null
als er geen instantie wordt gestart over het gevraagde element.
Als alternatief getOrCreateInstance
kan worden gebruikt om de instantie te koppelen aan een DOM-element, of om een nieuwe te maken voor het geval deze niet is geïnitialiseerd.
bootstrap.Popover.getOrCreateInstance(myPopoverEl, configObject)
Als een instantie niet is geïnitialiseerd, kan deze een optioneel configuratieobject als tweede argument accepteren en gebruiken.
CSS-kiezers in constructors
Naast de methoden getInstance
en getOrCreateInstance
kunnen alle plug-in-constructors een DOM-element of een geldige CSS-selector als eerste argument accepteren. Plug-in-elementen worden gevonden met de querySelector
methode, omdat onze plug-ins slechts één enkel element ondersteunen.
const modal = new bootstrap.Modal('#myModal')
const dropdown = new bootstrap.Dropdown('[data-bs-toggle="dropdown"]')
const offcanvas = bootstrap.Offcanvas.getInstance('#myOffcanvas')
const alert = bootstrap.Alert.getOrCreateInstance('#myAlert')
Asynchrone functies en overgangen
Alle programmatische API-methoden zijn asynchroon en keren terug naar de beller zodra de overgang is gestart, maar voordat deze eindigt . Om een actie uit te voeren zodra de overgang is voltooid, kunt u naar de bijbehorende gebeurtenis luisteren.
const myCollapseEl = document.querySelector('#myCollapse')
myCollapseEl.addEventListener('shown.bs.collapse', event => {
// Action to execute once the collapsible area is expanded
})
Bovendien wordt een methodeaanroep op een overgangscomponent genegeerd .
const myCarouselEl = document.querySelector('#myCarousel')
const carousel = bootstrap.Carousel.getInstance(myCarouselEl) // Retrieve a Carousel instance
myCarouselEl.addEventListener('slid.bs.carousel', event => {
carousel.to('2') // Will slide to the slide 2 as soon as the transition to slide 1 is finished
})
carousel.to('1') // Will start sliding to the slide 1 and returns to the caller
carousel.to('2') // !! Will be ignored, as the transition to the slide 1 is not finished !!
dispose
methode
Hoewel het misschien correct lijkt om de dispose
methode onmiddellijk daarna te gebruiken hide()
, zal dit tot onjuiste resultaten leiden. Hier is een voorbeeld van het probleemgebruik:
const myModal = document.querySelector('#myModal')
myModal.hide() // it is asynchronous
myModal.addEventListener('shown.bs.hidden', event => {
myModal.dispose()
})
Standaard instellingen
U kunt de standaardinstellingen voor een plug-in wijzigen door het Constructor.Default
object van de plug-in aan te passen:
// changes default for the modal plugin's `keyboard` option to false
bootstrap.Modal.Default.keyboard = false
Methoden en eigenschappen
Elke Bootstrap-plug-in onthult de volgende methoden en statische eigenschappen.
Methode | Beschrijving |
---|---|
dispose |
Vernietigt de modal van een element. (Verwijdert opgeslagen gegevens op het DOM-element) |
getInstance |
Statische methode waarmee u de modale instantie kunt krijgen die is gekoppeld aan een DOM-element. |
getOrCreateInstance |
Statische methode waarmee u de modale instantie kunt krijgen die is gekoppeld aan een DOM-element, of een nieuwe kunt maken voor het geval deze niet is geïnitialiseerd. |
Statische eigenschap | Beschrijving |
---|---|
NAME |
Retourneert de naam van de plug-in. (Voorbeeld: bootstrap.Tooltip.NAME ) |
VERSION |
De versie van elk van de plug-ins van Bootstrap is toegankelijk via de VERSION eigenschap van de constructor van de plug-in (voorbeeld: bootstrap.Tooltip.VERSION ) |
ontsmettingsmiddel
Tooltips en Popovers gebruiken ons ingebouwde ontsmettingsmiddel om opties op te schonen die HTML accepteren.
De standaardwaarde allowList
is de volgende:
const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
const DefaultAllowlist = {
// Global attributes allowed on any supplied element below.
'*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
a: ['target', 'href', 'title', 'rel'],
area: [],
b: [],
br: [],
col: [],
code: [],
div: [],
em: [],
hr: [],
h1: [],
h2: [],
h3: [],
h4: [],
h5: [],
h6: [],
i: [],
img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
li: [],
ol: [],
p: [],
pre: [],
s: [],
small: [],
span: [],
sub: [],
sup: [],
strong: [],
u: [],
ul: []
}
Als u nieuwe waarden aan deze standaard wilt toevoegen, allowList
kunt u het volgende doen:
const myDefaultAllowList = bootstrap.Tooltip.Default.allowList
// To allow table elements
myDefaultAllowList.table = []
// To allow td elements and data-bs-option attributes on td elements
myDefaultAllowList.td = ['data-bs-option']
// You can push your custom regex to validate your attributes.
// Be careful about your regular expressions being too lax
const myCustomRegex = /^data-my-app-[\w-]+/
myDefaultAllowList['*'].push(myCustomRegex)
Als u ons ontsmettingsmiddel wilt omzeilen omdat u liever een speciale bibliotheek gebruikt, bijvoorbeeld DOMPurify , moet u het volgende doen:
const yourTooltipEl = document.querySelector('#yourTooltip')
const tooltip = new bootstrap.Tooltip(yourTooltipEl, {
sanitizeFn(content) {
return DOMPurify.sanitize(content)
}
})
Optioneel met jQuery
Je hebt jQuery niet nodig in Bootstrap 5 , maar het is nog steeds mogelijk om onze componenten te gebruiken met jQuery. Als Bootstrap jQuery
in het window
object detecteert, voegt het al onze componenten toe aan het plug-insysteem van jQuery. Hiermee kunt u het volgende doen:
$('[data-bs-toggle="tooltip"]').tooltip() // to enable tooltips, with default configuration
$('[data-bs-toggle="tooltip"]').tooltip({ boundary: 'clippingParents', customClass: 'myClass' }) // to initialize tooltips with given configuration
$('#myTooltip').tooltip('show') // to trigger `show` method
Hetzelfde geldt voor onze andere componenten.
Geen conflict
Soms is het nodig om Bootstrap-plug-ins te gebruiken met andere UI-frameworks. In deze omstandigheden kunnen naamruimte-botsingen af en toe optreden. Als dit gebeurt, kunt u een beroep doen .noConflict
op de plug-in waarvan u de waarde wilt terugzetten.
const bootstrapButton = $.fn.button.noConflict() // return $.fn.button to previously assigned value
$.fn.bootstrapBtn = bootstrapButton // give $().bootstrapBtn the Bootstrap functionality
Bootstrap ondersteunt officieel geen JavaScript-bibliotheken van derden, zoals Prototype of jQuery UI. Ondanks .noConflict
gebeurtenissen met naamruimte, kunnen er compatibiliteitsproblemen zijn die u zelf moet oplossen.
jQuery-evenementen
Bootstrap zal jQuery detecteren als jQuery
het aanwezig is in het window
object en er geen data-bs-no-jquery
attribuut is ingesteld op <body>
. Als jQuery wordt gevonden, zal Bootstrap gebeurtenissen uitzenden dankzij het gebeurtenissysteem van jQuery. Dus als je naar de gebeurtenissen van Bootstrap wilt luisteren, moet je de jQuery-methoden ( .on
, .one
) gebruiken in plaats van addEventListener
.
$('#myTab a').on('shown.bs.tab', () => {
// do something...
})
JavaScript uitgeschakeld
De plug-ins van Bootstrap hebben geen speciale fallback wanneer JavaScript is uitgeschakeld. Als u in dit geval om de gebruikerservaring geeft, gebruik <noscript>
dan om de situatie uit te leggen (en hoe u JavaScript opnieuw kunt inschakelen) aan uw gebruikers, en/of voeg uw eigen aangepaste fallbacks toe.