bootstrap jquery show.bs.modal事件不会触发

m4r*_*rlo 70 jquery modal-dialog twitter-bootstrap-3

我正在使用bootstrap 3 docs中的模态示例.模态有效.但是我需要在它触发时访问show.bs.modal事件.现在我只是想:

$('#myModal').on('show.bs.modal', function () {
   alert('hi')
})
Run Code Online (Sandbox Code Playgroud)

没有任何事情发生,事件不会发生.我究竟做错了什么???这对我来说没有意义.

Ali*_*Ali 81

用这个:

$(document).on('show.bs.modal','#myModal', function () {
  alert('hi');
})
Run Code Online (Sandbox Code Playgroud)

  • 这解决了我的问题.但我把它放在document.ready函数之外.当我放入document.ready时,它无法正常工作.可以帮助别人. (6认同)
  • 当您使用 `$(document).on(...` 时,您将侦听器附加到 *document* 上下文,无论您的目标元素是否存在。您应该添加事件名称作为第一个参数,并将回调函数添加为最后,但您可以添加查询选择器作为第二个参数 (3认同)
  • 这应该是公认的答案,因为它通过`$(data).modal('show');`与动态创建的ajax模态完美配合. (2认同)
  • 这将触发您在文档上的每个模态.要仅定位特定模态,您可以使用`$(document).on('hidden.bs.modal',function(e){if(e.target.id ==='my-modal-id'){alert( 'hi');}});`.这里的ID来自`<div class ="modal fade"id ="my-modal-id">` (2认同)
  • @przno 不,它不会,第二个参数是指定元素的选择器。 (2认同)

Pie*_*rre 74

确保on('shown.bs.modal')在实例化弹出模式之前将其放入

$("#myModal").on("shown.bs.modal", function () { 
    alert('Hi');
});
$("#myModal").modal('show'); //This can also be $("#myModal").modal({ show: true });
Run Code Online (Sandbox Code Playgroud)

要么

$("#myModal").on("shown.bs.modal", function () { 
    alert('Hi');
}).modal('show');
Run Code Online (Sandbox Code Playgroud)

要专注于某个领域,最好使用shown.bs.modal代替,show.bs.modal但也许出于其他原因,你想要隐藏背景或在模态开始显示之前设置一些东西,使用该show.bs.modal功能.

  • ^这解决了我的问题。另外,“ show.bs.modal”不同于“ shown.bs.modal”。前者在模态即将显示时触发。后者已显示出来。大不同。 (2认同)

Chl*_*loe 16

包含您的功能$(document).ready(function() {,或更简单地说$(function() {.在CoffeeScript中,这看起来像

$ ->
  $('#myModal').on 'show.bs.modal', (event)->
Run Code Online (Sandbox Code Playgroud)

没有它,JavaScript在文档加载之前执行,并且#myModal还不是DOM的一部分.这是Bootstrap参考.


Tre*_*vor 10

试试这个

$('#myModal').on('shown.bs.modal', function () {
   alert('hi');
});
Run Code Online (Sandbox Code Playgroud)

使用shown而不是show确保在功能结束时保留半冒号并发出警报.

  • 'show.bs.modal'和'shown.bs.modal'都应该适用于我的目的,它们都被列为bootstrap文档中的有效事件.仍然无法正常工作. (6认同)
  • 谢谢@特雷弗。这对我也有用。我包括了 2 个 jquery.js。:-p (2认同)

小智 8

$(document).on('shown.bs.modal','.modal', function () {

/// TODO EVENTS

});
Run Code Online (Sandbox Code Playgroud)

  • 不知何故,这是对我最有帮助的答案。似乎使用`.modal`而不是引用模态ID是解决方案......谢谢! (2认同)

小智 8

添加这个:

$(document).ready(function(){
    $(document).on('shown.bs.modal','.modal', function () {
         // DO EVENTS
    });
});
Run Code Online (Sandbox Code Playgroud)


its*_*zad 6

类似的事情发生在我身上,我用setTimeout解决了.

Bootstrap使用以下超时来完成显示:

c.TRANSITION_DURATION = 300,c.BACKDROP_TRANSITION_DURATION = 150,

所以使用超过300个必须工作,对我来说200工作:

$('#myModal').on('show.bs.modal', function (e) {
    setTimeout(function(){
        //Do something if necessary
    }, 300);                        
})
Run Code Online (Sandbox Code Playgroud)


aer*_*son 5

就我而言,我缺少 .modal-dialog div

不触发事件: shown.bs.modal

<div id="loadingModal" class="modal fade">
  <p>Loading...</p>
</div>
Run Code Online (Sandbox Code Playgroud)

是否触发事件: shown.bs.modal

<div id="loadingModal" class="modal fade">
  <div class="modal-dialog">      
    <p>Loading...</p>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)