跳到主要內容 跳到文件瀏覽

使用我們選用的 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。以下是部分最受歡迎的選項

將 Bootstrap 作為模組使用

親自試試看!twbs/examples 儲存庫下載使用 Bootstrap 作為 ES 模組的原始碼和工作示範。您也可以 在 StackBlitz 中開啟範例

我們提供以 ESM 建置的 Bootstrap 版本(bootstrap.esm.jsbootstrap.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-configdata-bs-js 物件 的合併結果,其中最新提供的鍵值會覆寫其他鍵值。

選擇器

我們使用原生的 querySelectorquerySelectorAll 方法查詢 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 選擇器

除了 getInstancegetOrCreateInstance 方法之外,所有外掛程式建構函式都可以接受 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),和/或新增您自己的自訂後備。