メインコンテンツへスキップ

Bootstrap4.xの使い方をBootstrap3.xからの変更箇所を交えて解説しています。

JavaScript

jQueryに組み込まれたJavaScriptプラグインを使用して、Bootstrapに活力を与える。各プラグイン、データとプログラムのAPIオプションなどについて学習する。

個別か一括で(Individual or compiled)

プラグインは個別(Bootstrapの個別の /js/dist/*.js ファイルを使用)か、一括版(bootstrap.js か軽量版の bootstrap.min.js)が使用可能(両方を組み込む必要はない)。

バンドラ(webpack、Rollupなど)を使用する場合は、UMD対応の /js/dist/*.js ファイルが使用可能。

※Bootstrapの個別の *.js ファイル(ソースファイルjs/dist/ 内にある)

 

依存関係(Dependencies)v4.0.0変更

一部のプラグインとCSSコンポーネントは、他のプラグインに依存する。個別のプラグインを組み込む場合は、解説でこれらの依存関係を確認すること。また、すべてのプラグインは、jQueryに依存しているので注意(つまりプラグインファイルの前にjQueryファイルを導入する必要がある)。jQueryのどのバージョンをサポートしているかはpackage.json(peerDependenciesの項目)に記載(v4.6.2時点で1.9.1~3.xに対応)。

Bootstrapのドロップダウン、ツールチップ、ポップオーバーは、Popperにも依存している。

【変更履歴】

  • 【v4.0.0】
    • 記載ファイル:bower.jsonpackage.json

 

データ属性(Data attributes)

ほぼ全てのBootstrapプラグインは、HTMLだけでデータ属性を使用して有効化と構成が可能(JavaScript機能を使用する推奨方法)。必ず1つの要素に対して1組のデータ属性を使用すること(同じボタンからツールチップとモーダルを起動することなどは不可)。

しかし、この機能を無効にすることが望ましい場合もある。データ属性APIを無効にするには、次のように data-api で使用した名前空間ドキュメント上のすべてのイベントのバインドを解除:

設定例
JavaScript$(document).off('.data-api')

また特定のプラグインを対象にするには、次のように data-api の名前空間とともに名前空間としてプラグインの名前を組み込むことも可能:

設定例
JavaScript$(document).off('.alert.data-api')

 

イベント(Events)

Bootstrapは、ほとんどのプラグインの独自の動作のためのカスタムイベントを提供。通常、これらは動詞、過去分詞の形態になる-動詞形(show など)がイベントの開始時に起動され、その過去分詞形(shown など)がアクションの完了時に起動される。

すべての動詞形のイベントで preventDefault() 機能を提供。これにより、アクション開始前にそのアクションの実行を停止することが可能。イベントハンドラからfalseを返すと、preventDefault() も自動的に呼び出される。

設定例
JavaScript$('#myModal').on('show.bs.modal', function (event) {
	if (!data) {
		return event.preventDefault() // モーダルの表示を止める
	}
})

 

プログラムに基づいたAPI(Programmatic API)

単にJavaScript API経由で、すべてのBootstrapのプラグインが使用可能。すべての公開APIは、単独か連鎖的なメソッドで処理結果を返す。

設定例
JavaScript$('.btn.danger').button('toggle').addClass('fat')

すべてのメソッドは、オプションのオプション・オブジェクト、特定のメソッドを対象とした文字列を入れるか、空欄(デフォルトの動作でプラグインを開始)にする:

設定例
JavaScript$('#myModal').modal() // デフォルトで初期化
$('#myModal').modal({ keyboard: false }) // キーボードなしで初期化
$('#myModal').modal('show') // 初期化して直ちに表示を呼び出す

各プラグインは、Constructor プロパティ:$ fn.popover.Constructor で未加工のコンストラクタも公開。特定のプラグイン・インスタンスを取得したい場合は、要素を $('[rel=popover]').data('popover') のように設定して直接取得する。

同期関数と遷移(Asynchronous functions and transitions)

すべてのプログラムAPIメソッドは非同期であり、遷移が開始された後、終了する前に呼び出し元に戻る。

遷移が完了したらアクションを実行するために、対応するイベントに従う。

設定例
JavaScript$('#myCollapse').on('shown.bs.collapse', function (event) {
	// 折り畳み領域が展開された後に実行するアクション
})

さらに、遷移コンポーネントのメソッド呼び出しは無視される

設定例
JavaScript$('#myCarousel').on('slid.bs.carousel', function (event) {
	$('#myCarousel').carousel('2') // スライド1への移行が終了するとすぐにスライド2にスライド
})

$('#myCarousel').carousel('1') // スライド1にスライドして呼び出し元に戻る
$('#myCarousel').carousel('2') // !! スライド1への移行が終了していないため、無視される !!

デフォルト設定(Default settings)

プラグインの Constructor.DEFAULTS オブジェクトを変更することにより、プラグインのデフォルト設定を変更することが可能:

設定例
JavaScript// モーダルプラグインの`keyboard`オプションのデフォルトをfalseに変更
$.fn.modal.Constructor.DEFAULTS.keyboard = false 

 

競合の回避(No conflict)

他のUIフレームワークでBootstrapプラグインを使用する必要がある場合には、名前空間の衝突が起きることがある。そのような場合は、値を元に戻したいプラグインで .noConflict を呼び出すことが可能。

設定例
JavaScriptvar bootstrapButton = $.fn.button.noConflict() // 以前$.fn.buttonに割り当てられた値に戻す
$.fn.bootstrapBtn = bootstrapButton // $().bootstrapBtnにBootstrapの機能を与える

 

バージョン・ナンバー(Version numbers)

Bootstrapの各jQueryプラグインのバージョンは、プラグインのコンストラクタの VERSION プロパティ経由で取得可能。例えばツールチッププラグインの場合:

設定例
JavaScript$.fn.tooltip.Constructor.VERSION // => "4.6.2"

 

JavaScript無効時の特別なフォールバック(No special fallbacks when JavaScript is disabled)

JavaScriptが無効になっていると、Bootstrapのプラグインは特に適切なフォールバックをしない。この場合のユーザーの体験を重視する場合は、<noscript> を使用してユーザーに状況(とJavaScriptを再度有効にする方法)を説明するか、独自のカスタム・フォールバックを追加する。

 

ユーティリティ(Util)

すべてのBootstrapのJavascriptファイルは、util.js に依存しており、他のJavaScriptファイルと一緒に組み込む必要がある。すでにコンパイル済の(または軽量化された)bootstrap.js を使用している場合は、そこに組み込まれているので、改めて追加する必要はない。

util.js には、ユーティリティ機能と transitionEnd イベントの基本な補助とCSS遷移アニメーションエミュレーターが組み込まれている。これは他のプラグインでCSS遷移アニメーションのサポートをチェックし、遷移アニメーションを実行するために使用される。

【変更履歴】

  • 【v4.0.0】
    • v3の transition.jsutil.js

 

HTMLサニタイザー(Sanitizer)v4.3.1新設

ツールチップポップオーバーでは、HTMLを受け付けるオプションでサニタイズするためにBootstrap内蔵のサニタイザーを使用。
※ツールチップとポップオーバープラグインの data-template 属性には、属性値に渡すことができるHTMLの適切なXSSサニタイズがなかったため実装。

デフォルトの whiteList 値は次のとおり:

JavaScriptvar ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
var DefaultWhitelist = {
  // 以下の任意の要素で許可されているグローバル属性
  '*': ['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: []
}

このデフォルトの whiteList に新しい値を追加したい場合は、次のようにする:

設定例
JavaScriptvar myDefaultWhiteList = $.fn.tooltip.Constructor.Default.whiteList

// テーブル要素を許可
myDefaultWhiteList.table = []

// td要素とtd要素のdata-option属性を許可
myDefaultWhiteList.td = ['data-option']

// 属性を検証するために自分で任意の正規表現を追加することが可能
// 正規表現がゆるくなりすぎないように注意
var myCustomRegex = /^data-my-app-[\w-]+/
myDefaultWhiteList['*'].push(myCustomRegex)

DOMPurifyなどの専用ライブラリを使用するためにBootstrapのサニタイザーを回避する場合は、次の手順を実行する必要がある:

設定例
JavaScript$('#yourTooltip').tooltip({
	sanitizeFn: function (content) {
		return DOMPurify.sanitize(content)
	}
})