javascript.md 9.06 KB
Newer Older
Mark Otto's avatar
Mark Otto committed
1
---
Mark Otto's avatar
Mark Otto committed
2
layout: docs
Mark Otto's avatar
Mark Otto committed
3
title: JavaScript
XhmikosR's avatar
XhmikosR committed
4
description: Bring Bootstrap to life with our optional JavaScript plugins. Learn about each plugin, our data and programmatic API options, and more.
5
group: getting-started
6
toc: true
Mark Otto's avatar
Mark Otto committed
7
8
---

Mark Otto's avatar
Mark Otto committed
9
## Individual or compiled
Mark Otto's avatar
Mark Otto committed
10

11
12
13
Plugins can be included individually (using Bootstrap's individual `js/dist/*.js`), or all at once using `bootstrap.js` or the minified `bootstrap.min.js` (don't include both).

If you use a bundler (Webpack, Rollup...), you can use `/js/dist/*.js` files which are UMD ready.
Mark Otto's avatar
Mark Otto committed
14

15
16
17
18
## Using Bootstrap as a module

We provide a version of Bootstrap built as `ESM` (`bootstrap.esm.js` and `bootstrap.esm.min.js`) which allows you to use Bootstrap as a module in your browser, if your [targeted browsers support it](https://caniuse.com/#feat=es6-module).

XhmikosR's avatar
XhmikosR committed
19
{{< highlight html >}}
20
21
22
23
24
25
<script type="module">
  import { Toast } from 'bootstrap.esm.min.js'

  Array.from(document.querySelectorAll('.toast'))
    .forEach(toastNode => new Toast(toastNode))
</script>
XhmikosR's avatar
XhmikosR committed
26
{{< /highlight >}}
27

XhmikosR's avatar
XhmikosR committed
28
{{< callout warning >}}
29
30
## Incompatible plugins

XhmikosR's avatar
XhmikosR committed
31
Due to browser limitations, some of our plugins, namely Dropdown, Tooltip and Popover plugins, cannot be used in a `<script>` tag with `module` type because they depend on Popper.js. For more information about the issue see [here](https://v8.dev/features/modules#specifiers).
XhmikosR's avatar
XhmikosR committed
32
{{< /callout >}}
33

Mark Otto's avatar
Mark Otto committed
34
## Dependencies
Mark Otto's avatar
Mark Otto committed
35

XhmikosR's avatar
XhmikosR committed
36
Some plugins and CSS components depend on other plugins. If you include plugins individually, make sure to check for these dependencies in the docs.
37

38
Our dropdowns, popovers and tooltips also depend on [Popper.js](https://popper.js.org/).
Mark Otto's avatar
Mark Otto committed
39

XhmikosR's avatar
XhmikosR committed
40
## Still want to use jQuery? It's possible!
41

XhmikosR's avatar
XhmikosR committed
42
Bootstrap 5 is designed to be used without jQuery, but it's still possible to use our components with jQuery. **If Bootstrap detects `jQuery` in the `window` object** it'll add all of our components in jQuery's plugin system; this means you'll be able to do `$('[data-toggle="tooltip"]').tooltip()` to enable tooltips. The same goes for our other components.
43

Mark Otto's avatar
Mark Otto committed
44
## Data attributes
Mark Otto's avatar
Mark Otto committed
45

Mark Otto's avatar
Mark Otto committed
46
Nearly all Bootstrap plugins can be enabled and configured through HTML alone with data attributes (our preferred way of using JavaScript functionality). Be sure to **only use one set of data attributes on a single element** (e.g., you cannot trigger a tooltip and modal from the same button.)
Mark Otto's avatar
Mark Otto committed
47

XhmikosR's avatar
XhmikosR committed
48
{{< callout warning >}}
49
## Selectors
50
51
52

Currently to query DOM elements we use the native methods `querySelector` and `querySelectorAll` for performance reasons, so you have to use [valid selectors](https://www.w3.org/TR/CSS21/syndata.html#value-def-identifier).
If you use special selectors, for example: `collapse:Example` be sure to escape them.
XhmikosR's avatar
XhmikosR committed
53
{{< /callout >}}
54

55
56
57
58
## Events

Bootstrap provides custom events for most plugins' unique actions. Generally, these come in an infinitive and past participle form - where the infinitive (ex. `show`) is triggered at the start of an event, and its past participle form (ex. `shown`) is triggered on the completion of an action.

Mark Otto's avatar
Mark Otto committed
59
All infinitive events provide [`preventDefault()`](https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault) functionality. This provides the ability to stop the execution of an action before it starts. Returning false from an event handler will also automatically call `preventDefault()`.
60

XhmikosR's avatar
XhmikosR committed
61
{{< highlight js >}}
62
63
64
var myModal = document.getElementById('myModal')

myModal.addEventListener('show.bs.modal', function (e) {
65
66
67
  if (!data) {
    return e.preventDefault() // stops modal from being shown
  }
68
})
XhmikosR's avatar
XhmikosR committed
69
{{< /highlight >}}
70

Johann-S's avatar
Johann-S committed
71
72
73
{{< callout warning >}}
## jQuery events

XhmikosR's avatar
XhmikosR committed
74
Bootstrap will detect jQuery if `jQuery` is present in the `window` object and there is no `data-no-jquery` attribute set on `<body>`. If jQuery is found, Bootstrap will emit events thanks to jQuery's event system. So if you want to listen to Bootstrap's events, you'll have to use the jQuery methods (`.on`, `.one`) instead of `addEventListener`.
Johann-S's avatar
Johann-S committed
75
76
77
78
79
80
81
82

{{< highlight js >}}
$('#myTab a').on('shown.bs.tab', function () {
  // do something...
})
{{< /highlight >}}
{{< /callout >}}

Mark Otto's avatar
Mark Otto committed
83
## Programmatic API
Mark Otto's avatar
Mark Otto committed
84

85
All constructors accept an optional options object or nothing (which initiates a plugin with its default behavior):
Mark Otto's avatar
Mark Otto committed
86

XhmikosR's avatar
XhmikosR committed
87
{{< highlight js >}}
88
var myModalEl = document.getElementById('myModal')
Mark Otto's avatar
Mark Otto committed
89

90
91
var modal = new bootstrap.Modal(myModalEl) // initialized with defaults
var modal = new bootstrap.Modal(myModalEl, { keyboard: false }) // initialized with no keyboard
XhmikosR's avatar
XhmikosR committed
92
{{< /highlight >}}
Mark Otto's avatar
Mark Otto committed
93

94
If you'd like to get a particular plugin instance, each plugin exposes a `getInstance` method. In order to retrieve it directly from an element, do this: `bootstrap.Popover.getInstance(myPopoverEl)`.
Mark Otto's avatar
Mark Otto committed
95

96
97
### Asynchronous functions and transitions

Nabil Kadimi's avatar
Nabil Kadimi committed
98
All programmatic API methods are **asynchronous** and return to the caller once the transition is started but **before it ends**.
Mark Otto's avatar
Mark Otto committed
99

100
In order to execute an action once the transition is complete, you can listen to the corresponding event.
101

XhmikosR's avatar
XhmikosR committed
102
{{< highlight js >}}
103
104
105
var myCollapseEl = document.getElementById('#myCollapse')

myCollapseEl.addEventListener('shown.bs.collapse', function (e) {
106
107
  // Action to execute once the collapsible area is expanded
})
XhmikosR's avatar
XhmikosR committed
108
{{< /highlight >}}
Mark Otto's avatar
Mark Otto committed
109

110
In addition a method call on a **transitioning component will be ignored**.
111

XhmikosR's avatar
XhmikosR committed
112
{{< highlight js >}}
113
var myCarouselEl = document.getElementById('myCarousel')
114
var carousel = bootstrap.Carousel.getInstance(myCarouselEl) // Retrieve a Carousel instance
115
116
117

myCarouselEl.addEventListener('slid.bs.carousel', function (e) {
  carousel.to('2') // Will slide to the slide 2 as soon as the transition to slide 1 is finished
118
})
Mark Otto's avatar
Mark Otto committed
119

120
121
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 !!
XhmikosR's avatar
XhmikosR committed
122
{{< /highlight >}}
123
124

### Default settings
125

126
You can change the default settings for a plugin by modifying the plugin's `Constructor.Default` object:
Mark Otto's avatar
Mark Otto committed
127

XhmikosR's avatar
XhmikosR committed
128
{{< highlight js >}}
XhmikosR's avatar
XhmikosR committed
129
// changes default for the modal plugin's `keyboard` option to false
130
bootstrap.Modal.Default.keyboard = false
XhmikosR's avatar
XhmikosR committed
131
{{< /highlight >}}
Mark Otto's avatar
Mark Otto committed
132

133
## No conflict (only if you use jQuery)
Mark Otto's avatar
Mark Otto committed
134

135
Sometimes it is necessary to use Bootstrap plugins with other UI frameworks. In these circumstances, namespace collisions can occasionally occur. If this happens, you may call `.noConflict` on the plugin you wish to revert the value of.
Mark Otto's avatar
Mark Otto committed
136

XhmikosR's avatar
XhmikosR committed
137
{{< highlight js >}}
138
var bootstrapButton = $.fn.button.noConflict() // return $.fn.button to previously assigned value
XhmikosR's avatar
XhmikosR committed
139
$.fn.bootstrapBtn = bootstrapButton // give $().bootstrapBtn the Bootstrap functionality
XhmikosR's avatar
XhmikosR committed
140
{{< /highlight >}}
Mark Otto's avatar
Mark Otto committed
141

Mark Otto's avatar
Mark Otto committed
142
## Version numbers
Mark Otto's avatar
Mark Otto committed
143

XhmikosR's avatar
XhmikosR committed
144
The version of each of Bootstrap's plugins can be accessed via the `VERSION` property of the plugin's constructor. For example, for the tooltip plugin:
Mark Otto's avatar
Mark Otto committed
145

XhmikosR's avatar
XhmikosR committed
146
{{< highlight js >}}
147
bootstrap.Tooltip.VERSION // => "{{< param current_version >}}"
XhmikosR's avatar
XhmikosR committed
148
{{< /highlight >}}
Mark Otto's avatar
Mark Otto committed
149

Mark Otto's avatar
Mark Otto committed
150
## No special fallbacks when JavaScript is disabled
Mark Otto's avatar
Mark Otto committed
151
152
153

Bootstrap's plugins don't fall back particularly gracefully when JavaScript is disabled. If you care about the user experience in this case, use [`<noscript>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript) to explain the situation (and how to re-enable JavaScript) to your users, and/or add your own custom fallbacks.

XhmikosR's avatar
XhmikosR committed
154
{{< callout warning >}}
155
##### Third-party libraries
156
157

**Bootstrap does not officially support third-party JavaScript libraries** like Prototype or jQuery UI. Despite `.noConflict` and namespaced events, there may be compatibility problems that you need to fix on your own.
XhmikosR's avatar
XhmikosR committed
158
{{< /callout >}}
159

160
161
162
163
164
165
## Sanitizer

Tooltips and Popovers use our built-in sanitizer to sanitize options which accept HTML.

The default `whiteList` value is the following:

XhmikosR's avatar
XhmikosR committed
166
{{< highlight js >}}
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
var DefaultWhitelist = {
  // 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', 'alt', 'title', 'width', 'height'],
  li: [],
  ol: [],
  p: [],
  pre: [],
  s: [],
  small: [],
  span: [],
  sub: [],
  sup: [],
  strong: [],
  u: [],
  ul: []
}
XhmikosR's avatar
XhmikosR committed
201
{{< /highlight >}}
202
203
204

If you want to add new values to this default `whiteList` you can do the following:

XhmikosR's avatar
XhmikosR committed
205
{{< highlight js >}}
206
var myDefaultWhiteList = bootstrap.Tooltip.Default.whiteList
207
208
209
210
211
212
213
214
215
216
217

// To allow table elements
myDefaultWhiteList.table = []

// To allow td elements and data-option attributes on td elements
myDefaultWhiteList.td = ['data-option']

// You can push your custom regex to validate your attributes.
// Be careful about your regular expressions being too lax
var myCustomRegex = /^data-my-app-[\w-]+/
myDefaultWhiteList['*'].push(myCustomRegex)
XhmikosR's avatar
XhmikosR committed
218
{{< /highlight >}}
219
220
221

If you want to bypass our sanitizer because you prefer to use a dedicated library, for example [DOMPurify](https://www.npmjs.com/package/dompurify), you should do the following:

XhmikosR's avatar
XhmikosR committed
222
{{< highlight js >}}
223
224
var yourTooltipEl = document.getElementById('yourTooltip')
var tooltip = new bootstrap.Tooltip(yourTooltipEl, {
225
226
227
228
  sanitizeFn: function (content) {
    return DOMPurify.sanitize(content)
  }
})
XhmikosR's avatar
XhmikosR committed
229
{{< /highlight >}}