javascript.md 8.72 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
## Using Bootstrap as a module

17
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/es6-module).
18

19
```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>
26
```
27

28
{{< callout warning >}}
29
30
## Incompatible plugins

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. For more information about the issue see [here](https://v8.dev/features/modules#specifiers).
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](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

Rohit Sharma's avatar
Rohit Sharma 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-bs-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

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.
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

61
```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
})
69
```
70

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

Rohit Sharma's avatar
Rohit Sharma committed
74
Bootstrap will detect jQuery if `jQuery` is present in the `window` object and there is no `data-bs-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
```js
Johann-S's avatar
Johann-S committed
77
78
79
$('#myTab a').on('shown.bs.tab', function () {
  // do something...
})
80
```
81
{{< /callout >}}
Johann-S's avatar
Johann-S committed
82

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

87
```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
92
```
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

102
```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
})
108
```
Mark Otto's avatar
Mark Otto committed
109

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

112
```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 !!
122
```
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

128
```js
XhmikosR's avatar
XhmikosR committed
129
// changes default for the modal plugin's `keyboard` option to false
130
bootstrap.Modal.Default.keyboard = false
131
```
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

137
```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
140
```
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

146
```js
147
bootstrap.Tooltip.VERSION // => "{{< param current_version >}}"
148
```
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.

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.
158
{{< /callout >}}
159

160
161
162
163
## Sanitizer

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

164
The default `allowList` value is the following:
165

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

203
If you want to add new values to this default `allowList` you can do the following:
204

205
```js
206
var myDefaultAllowList = bootstrap.Tooltip.Default.allowList
207
208

// To allow table elements
209
myDefaultAllowList.table = []
210

Rohit Sharma's avatar
Rohit Sharma committed
211
212
// To allow td elements and data-bs-option attributes on td elements
myDefaultAllowList.td = ['data-bs-option']
213
214
215
216

// 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-]+/
217
myDefaultAllowList['*'].push(myCustomRegex)
218
```
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:

222
```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)
  }
})
229
```