それが起こるとき
modal にクラス "fade" がある場合、.bs.modal に表示されるイベントは発生しません。一方、 show .bs.modalは常に機能します。https://github.com/twbs/bootstrap/issues/11793を参照して ください
HTML:
<div class="modal fade" id="first" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">Hello world from first modal</div>
</div>
</div>
<div class="modal" id="second" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">Hello world from second modal</div>
</div>
</div>
jQuery:
$('.modal').on('shown.bs.modal', function() {
//fired only in second modal
console.info('shown.bs.modal');
});
$('.modal').on('show.bs.modal', function() {
//fired always
console.info('show.bs.modal');
});
解決
ブートストラップ v3.3.6 の場合、1010 行を次のように置き換えます。
that.$element // wait for modal to slide in
何が問題ですか
1006 ~ 1015 行を見てください。
var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
transition ?
that.$dialog // wait for modal to slide in
.one('bsTransitionEnd', function () {
that.$element.trigger('focus').trigger(e)
})
.emulateTransitionEnd(Modal.TRANSITION_DURATION) :
that.$element.trigger('focus').trigger(e)
トランジションがない場合 (フェードクラスがない場合)、イベントeがすぐにトリガーされます (that.$element で)。トランジションでは、正確な理由はわかりませんが、どういうわけか関数emulateTransitionEndからのbsTransationEndイベントがthat.$dialog.one()によって処理されません。しかし、that.$elementでは、すべてが機能しているようです。