JavaScript
使用我們選用的 JavaScript 外掛,讓 Bootstrap 栩栩如生。瞭解每個外掛、我們的資料和程式化 API 選項,以及更多資訊。
個別或編譯
外掛可以個別包含(使用 Bootstrap 的個別 js/dist/*.js
),或使用 bootstrap.js
或縮小的 bootstrap.min.js
一次全部包含(不要同時包含這兩個)。
如果你使用打包器(Webpack、Parcel、Vite…),你可以使用 UMD 就緒的 /js/dist/*.js
檔案。
與 JavaScript 框架搭配使用
儘管 Bootstrap CSS 可以與任何框架搭配使用,但 Bootstrap JavaScript 與假設完全瞭解 DOM 的 JavaScript 框架(例如 React、Vue 和 Angular)並不完全相容。Bootstrap 和框架都可能嘗試變異相同的 DOM 元素,導致錯誤,例如下拉式選單停留在「開啟」位置。
對於使用此類框架的人來說,更好的替代方案是使用特定於框架的套件取代 Bootstrap JavaScript。以下是部分最受歡迎的選項
- React:React Bootstrap
親自試試看!從 twbs/examples 儲存庫下載使用 Bootstrap 搭配 React、Next.js 和 React Bootstrap 的原始碼和工作示範。您也可以 在 StackBlitz 中開啟範例。
- Vue:BootstrapVue(Bootstrap 4)
- Vue 3:BootstrapVueNext(Bootstrap 5,目前為 alpha 版)
- Angular:ng-bootstrap
將 Bootstrap 作為模組使用
我們提供以 ESM
建置的 Bootstrap 版本(bootstrap.esm.js
和 bootstrap.esm.min.js
),讓您可以在瀏覽器中將 Bootstrap 作為模組使用,如果您的 目標瀏覽器支援的話。
<script type="module">
import { Toast } from 'bootstrap.esm.min.js'
Array.from(document.querySelectorAll('.toast'))
.forEach(toastNode => new Toast(toastNode))
</script>
與 JS 捆綁器相比,在瀏覽器中使用 ESM 時,您需要使用完整路徑和檔名,而不是模組名稱。 深入了解瀏覽器中的 JS 模組。 因此,我們在上面使用 'bootstrap.esm.min.js'
而不是 'bootstrap'
。不過,這會因為我們的 Popper 依賴項而變得更複雜,它會像這樣將 Popper 匯入我們的 JavaScript
import * as Popper from "@popperjs/core"
如果您照樣嘗試,您會在主控台中看到如下的錯誤
Uncaught TypeError: Failed to resolve module specifier "@popperjs/core". Relative references must start with either "/", "./", or "../".
若要修正這個問題,您可以使用 importmap
將任意模組名稱解析為完整路徑。如果您的 目標瀏覽器 不支援 importmap
,您需要使用 es-module-shims 專案。以下是 Bootstrap 和 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/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<title>Hello, modularity!</title>
</head>
<body>
<h1>Hello, modularity!</h1>
<button id="popoverButton" type="button" class="btn btn-primary btn-lg" 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/core@2.11.8/dist/esm/popper.min.js",
"bootstrap": "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.esm.min.js"
}
}
</script>
<script type="module">
import * as bootstrap from 'bootstrap'
new bootstrap.Popover(document.getElementById('popoverButton'))
</script>
</body>
</html>
依賴項
有些外掛程式和 CSS 元件依賴於其他外掛程式。如果您個別包含外掛程式,請務必在文件檔中查看這些依賴項。
我們的下拉式選單、彈出視窗和工具提示也依賴於 Popper。
資料屬性
幾乎所有 Bootstrap 外掛程式都可以透過 HTML 單獨使用資料屬性來啟用和設定(我們偏好的 JavaScript 功能使用方式)。請務必只對單一元素使用一組資料屬性(例如,您無法從同一個按鈕觸發工具提示和對話框)。
由於選項可以透過資料屬性或 JavaScript 傳遞,您可以將選項名稱附加到 data-bs-
,例如 data-bs-animation="{value}"
。請務必在透過資料屬性傳遞選項時,將選項名稱的類型從「camelCase」變更為「kebab-case」。例如,使用 data-bs-custom-class="beautifier"
而不是 data-bs-customClass="beautifier"
。
自 Bootstrap 5.2.0 起,所有元件都支援一個實驗性的保留資料屬性 data-bs-config
,它可以將簡單的元件設定儲存在 JSON 字串中。當一個元素具有 data-bs-config='{"delay":0, "title":123}'
和 data-bs-title="456"
屬性時,最終的 title
值將會是 456
,而個別的資料屬性將會覆寫 data-bs-config
上提供的數值。此外,現有的資料屬性能夠儲存 JSON 值,例如 data-bs-delay='{"show":0,"hide":150}'
。
最終的設定物件是 data-bs-config
、data-bs-
和 js 物件
的合併結果,其中最新提供的鍵值會覆寫其他鍵值。
選擇器
我們使用原生的 querySelector
和 querySelectorAll
方法查詢 DOM 元素,以提升效能,因此您必須使用 有效的選擇器。如果您使用特殊選擇器,例如 collapse:Example
,請務必對它們進行跳脫。
事件
Bootstrap 為大多數外掛程式獨特動作提供自訂事件。通常,這些事件會以不定詞和過去分詞的形式出現,其中不定詞(例如 show
)會在事件開始時觸發,而其過去分詞形式(例如 shown
)則會在動作完成時觸發。
所有不定詞事件都提供 preventDefault()
功能。這提供了在動作開始前停止執行動作的能力。從事件處理常式傳回 false 也會自動呼叫 preventDefault()
。
const myModal = document.querySelector('#myModal')
myModal.addEventListener('show.bs.modal', event => {
return event.preventDefault() // stops modal from being shown
})
程式化 API
所有建構函式都接受一個選用的選項物件或無(它會以預設行為啟動外掛程式)
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
如果您想取得特定外掛程式執行個體,每個外掛程式都會公開一個 getInstance
方法。例如,直接從元素擷取執行個體
bootstrap.Popover.getInstance(myPopoverEl)
如果未在請求的元素上啟動執行個體,此方法會傳回 null
。
或者,可以使用 getOrCreateInstance
取得與 DOM 元素關聯的執行個體,或在尚未初始化的情況下建立一個新的執行個體。
bootstrap.Popover.getOrCreateInstance(myPopoverEl, configObject)
如果未初始化執行個體,它可能會接受並使用一個選用設定物件作為第二個引數。
建構函式中的 CSS 選擇器
除了 getInstance
和 getOrCreateInstance
方法之外,所有外掛程式建構函式都可以接受 DOM 元素或有效的 CSS 選擇器 作為第一個引數。外掛程式元素是使用 querySelector
方法找到的,因為我們的外掛程式僅支援單一元素。
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')
非同步函式和轉場
所有程式化 API 方法都是非同步的,並在轉場開始後傳回呼叫者,但在轉場結束前傳回。為了在轉場完成後執行動作,您可以聆聽對應的事件。
const myCollapseEl = document.querySelector('#myCollapse')
myCollapseEl.addEventListener('shown.bs.collapse', event => {
// Action to execute once the collapsible area is expanded
})
此外,對轉場中元件的呼叫方法將會被忽略。
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
方法
雖然在 hide()
之後立即使用 dispose
方法看似正確,但這將導致不正確的結果。以下是問題使用的範例
const myModal = document.querySelector('#myModal')
myModal.hide() // it is asynchronous
myModal.addEventListener('shown.bs.hidden', event => {
myModal.dispose()
})
預設設定
您可以透過修改外掛程式中的 Constructor.Default
物件來變更外掛程式的預設設定
// changes default for the modal plugin's `keyboard` option to false
bootstrap.Modal.Default.keyboard = false
方法和屬性
每個 Bootstrap 外掛程式都會公開下列方法和靜態屬性。
方法 | 說明 |
---|---|
dispose |
銷毀元素的模態視窗。(移除儲存在 DOM 元素中的資料) |
getInstance |
靜態 方法,可讓您取得與 DOM 元素關聯的模態視窗實例。 |
getOrCreateInstance |
靜態 方法,可讓您取得與 DOM 元素關聯的模態視窗實例,或是在尚未初始化時建立新的實例。 |
靜態屬性 | 說明 |
---|---|
NAME |
傳回外掛程式的名稱。(範例:bootstrap.Tooltip.NAME ) |
VERSION |
每個 Bootstrap 外掛程式的版本都可以透過外掛程式建構函式的 VERSION 屬性取得(範例:bootstrap.Tooltip.VERSION ) |
消毒程式
提示框和彈出框使用我們的內建消毒程式來消毒接受 HTML 的選項。
預設的 allowList
值如下
const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
export 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: [],
dd: [],
div: [],
dl: [],
dt: [],
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: []
}
如果您想新增新的值到這個預設的 allowList
,您可以執行下列動作
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)
如果您想略過我們的消毒程式,因為您偏好使用專用的函式庫,例如 DOMPurify,您應該執行下列動作
const yourTooltipEl = document.querySelector('#yourTooltip')
const tooltip = new bootstrap.Tooltip(yourTooltipEl, {
sanitizeFn(content) {
return DOMPurify.sanitize(content)
}
})
選擇性使用 jQuery
您不需要在 Bootstrap 5 中使用 jQuery,但仍然可以使用 jQuery 來使用我們的元件。如果 Bootstrap 在 window
物件中偵測到 jQuery
,它會在 jQuery 的外掛程式系統中新增我們所有的元件。這讓您可以執行下列動作
// to enable tooltips with the default configuration
$('[data-bs-toggle="tooltip"]').tooltip()
// to initialize tooltips with given configuration
$('[data-bs-toggle="tooltip"]').tooltip({
boundary: 'clippingParents',
customClass: 'myClass'
})
// to trigger the `show` method
$('#myTooltip').tooltip('show')
我們的其他元件也是如此。
無衝突
有時需要將 Bootstrap 外掛程式與其他 UI 架構搭配使用。在這種情況下,偶爾會發生命名空間衝突。如果發生這種情況,您可以在想要還原值的的外掛程式上呼叫 .noConflict
。
const bootstrapButton = $.fn.button.noConflict() // return $.fn.button to previously assigned value
$.fn.bootstrapBtn = bootstrapButton // give $().bootstrapBtn the Bootstrap functionality
Bootstrap 並未正式支援 Prototype 或 jQuery UI 等第三方 JavaScript 函式庫。儘管有 .noConflict
和命名空間事件,但您可能需要自行修正相容性問題。
jQuery 事件
如果 jQuery
存在於 window
物件中,且 <body>
上沒有設定 data-bs-no-jquery
屬性,Bootstrap 會偵測 jQuery。如果找到 jQuery,Bootstrap 會透過 jQuery 的事件系統發出事件。因此,如果您想要監聽 Bootstrap 的事件,您必須使用 jQuery 方法(.on
、.one
),而不是 addEventListener
。
$('#myTab a').on('shown.bs.tab', () => {
// do something...
})
停用 JavaScript
當 JavaScript 停用時,Bootstrap 的外掛程式沒有特殊後備。如果您關心這種情況下的使用者體驗,請使用 <noscript>
向您的使用者說明情況(以及如何重新啟用 JavaScript),和/或新增您自己的自訂後備。