跳至主要内容 跳至文档导航

使用我们的可选JavaScript插件,让Bootstrap栩栩如生。了解每个插件、我们的数据和编程API选项等。

单独使用或编译

插件可以单独使用(如使用Bootstrap的单个 js/dist/*.js),也可以使用一次性包含所有插件的bootstrap.js 或者压缩的 bootstrap.min.js(但这两个不能同时引入使用)。

如果你使用捆绑器(Webpack,Parcel,Vite…),那你可以使用UMD编译好的 /js/dist/*.js文件。

使用 JavaScript 框架

虽然 Bootstrap CSS 可以与任何框架一起使用,但 Bootstrap JavaScript 与 React、Vue 和 Angular 等 JavaScript 框架并不完全兼容,这些框架假定完全了解 DOM。Bootstrap 和框架都可能尝试改变相同的 DOM 元素,从而导致诸如下拉列表之类的错误卡在“打开”位置。

对于那些使用这种类型的框架的人来说,更好的选择是使用特定于框架的包而不是Bootstrap JavaScript。以下是一些最受欢迎的选项:

使用Bootstrap作为模块

自己试试吧!twbs/examples repository下载使用 Bootstrap 作为 ES 模块的源代码和工作演示。你也可以在StackBlitz中打开示例.

我们提供了一个构建为 ESM (bootstrap.esm.jsbootstrap.esm.min.js) 的Bootstrap版本,它允许您在浏览器中使用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.0-alpha2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-aFq/bzH65dt+w6FI2ooMVUpc+21e0SRygnTpmBvdBgSdnuTN7QbdgL+OapgHtvPp" 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.7/dist/esm/popper.min.js",
        "bootstrap": "https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha2/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.

数据属性(Data attributes)

几乎所有的 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}'

选择器(Selectors)

出于性能原因,我们使用本地的 querySelectorquerySelectorAll 方法来查询 DOM 元素,因此您必须使用 valid selectors。如果您使用特殊选择器,例如 collapse:Example, be sure ,请务必对其进行转义。

事件

Bootstrap 为大多数插件的独特操作提供自定义事件。通常,这些形式是不定式和过去分词形式 - 其中不定式(例如 show)在事件开始时触发,其过去分词形式(例如 shown)在动作完成时触发。

所有不定式事件都提供 preventDefault() 功能。这提供了在操作开始之前停止执行操作的功能。从事件处理程序返回 false 也将自动调用 preventDefault()

const myModal = document.querySelector('#myModal')

myModal.addEventListener('show.bs.modal', event => {
  if (!data) {
    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 Destroys an element’s modal. (Removes stored data on the DOM element)
getInstance Static method which allows you to get the modal instance associated with a DOM element.
getOrCreateInstance Static method which allows you to get the modal instance associated with a DOM element, or create a new one in case it wasn’t initialized.
Static property Description
NAME Returns the plugin name. (Example: bootstrap.Tooltip.NAME)
VERSION The version of each of Bootstrap’s plugins can be accessed via the VERSION property of the plugin’s constructor (Example: bootstrap.Tooltip.VERSION)

清理器(Sanitizer)

工具提示和弹出框使用我们的内置清理器来清理接受HTML的选项。

默认的 allowList 值如下:

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: []
}

如果要将新值添加到此默认 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 不正式支持第三方 JavaScript 库,如 Prototype 或 jQuery UI。尽管有 .noConflict 和命名空间事件,但可能存在需要自行修复的兼容性问题。

jQuery 事件

如果window对象中存在jQuery并且<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),或添加您自己的自定义回退。