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

时间:2013-10-09 18:16:54

标签: modal-dialog twitter-bootstrap-3 jquery

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

$('#myModal').on('show.bs.modal', function () {
   alert('hi')
})

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

19 个答案:

答案 0 :(得分:72)

确保在实例化弹出模式

之前放置on('shown.bs.modal')
$("#myModal").on("shown.bs.modal", function () { 
    alert('Hi');
});
$("#myModal").modal('show'); //This can also be $("#myModal").modal({ show: true });

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

要专注于某个字段,最好使用shown.bs.modal代替show.bs.modal,但也许出于其他原因,您希望在模式开始显示之前隐藏背景或设置某些内容,使用show.bs.modal函数。

答案 1 :(得分:17)

将您的功能包裹在$(document).ready(function() {中,或简称为$(function() {。在CoffeeScript中,这看起来像

$ ->
  $('#myModal').on 'show.bs.modal', (event)->

没有它,JavaScript在文档加载之前执行,#myModal还不是DOM的一部分。这是Bootstrap reference

答案 2 :(得分:10)

试试这个

$('#myModal').on('shown.bs.modal', function () {
   alert('hi');
});

使用shown代替show也可确保在功能结束时让半冒号发出警报。

答案 3 :(得分:8)

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

/// TODO EVENTS

});

答案 4 :(得分:5)

类似的事情发生在我身上,我已经使用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);                        
})

答案 5 :(得分:3)

我有一个类似但不同的问题,当我使用$(' #myModal')时仍然无法工作。当我使用$(窗口)时,我能够使它工作。

我的另一个问题是,如果我将模态div html内容存储在javascript变量中,我发现show事件不会触发。

var content="<div id='myModal' ...";
$(content).modal();
$(window).on('show.bs.modal', function (e) {
  alert('show test');
});

该事件从未被解雇,因为它没有发生

我的修复是在html正文中包含div

<body>
    <div id='myModal'>
       ...
    </div>
    <script>
        $('#myModal).modal();
        $(window).on('show.bs.modal', function (e) {
            alert('show test');
        });
    </script>
</body>

答案 6 :(得分:3)

请记住在调用&#34; js / bootstrap&#34;之后放入脚本,而不是之前。

答案 7 :(得分:3)

就我而言,我错过了.modal-dialog div

不会触发事件:shown.bs.modal

<div id="loadingModal" class="modal fade">
  <p>Loading...</p>
</div>

火灾事件:shown.bs.modal

<div id="loadingModal" class="modal fade">
  <div class="modal-dialog">      
    <p>Loading...</p>
  </div>
</div>

答案 8 :(得分:2)

确保在使用Bootstrap之前加载jQuery。听起来很基本,但我遇到了捕获这些模态事件的问题,结果发现错误不是我的代码,而是我在jQuery之前加载了Bootstrap。

答案 9 :(得分:2)

添加:

$(document).ready(function(){
    $(document).on('shown.bs.modal','.modal', function () {
         // DO EVENTS
    });
});

答案 10 :(得分:2)

bootstrap4也有同样的问题。 解决方案是将其添加到jQuery文档ready()函数中:

$(document).ready(function() {
    $('#myModal').on('show.bs.modal', function () {
       alert('hi')
    })
}

答案 11 :(得分:1)

有时在以下情况下无法使用

1)在$('#myModal').on('show.bs.modal'...)行之前,Java脚本代码中有错误。要进行故障排除,请在该行之前放置一条警报消息,以查看它在加载页面时是否出现。要解决上述问题,请消除上面的JS,看看哪个是问题

2)另一个问题是,如果您以错误的顺序加载JS。例如,在实际加载JQuery.js之前,可以先拥有$('#myModal').on('show.bs.modal'...)部分。在这种情况下,您的调用将被忽略,因此首先在HTML(请确保查看页面源代码)中检查JQuery的脚本链接是否在模态onShow调用上方,否则将被忽略。要进行故障排除,请在显示前先放一个警报。如果您在onShow函数中看到的是之前的一个,而没有看到,则很明显该函数无法执行。如果拼写正确,那么很有可能没有调用JQuery.js或在onShow部分之后进行了调用

答案 12 :(得分:1)

有同样的问题。对我来说是我按以下顺序两次加载了jQuery:

  1. 已加载jQuery
  2. 已加载的引导程序
  3. 再次加载jQuery

第二次加载jQuery时,它以某种方式破坏了对引导程序的引用并打开了模式,但on('shown.bs ..')方法从未触发。

答案 13 :(得分:0)

放置 setTimeout 的流行解决方案在某些情况下可能有效,但它是一个糟糕的解决方案。我自己在将它包装在 $(document).ready() 中时使用它当然(但它从来没有帮助),但我从来没有一个可靠的解决方案。某些浏览器/系统比其他浏览器/系统花费更多时间,有时 1000ms 还不够。我厌倦了寻找 $(document).ready() 为什么没有帮助,所以:

我采取了不同的方法。

当我第一次需要使用模态时,我会订阅模态事件。

<a href="javascript:void(0)" onclick="ShowModal()">Open my modal</a>

在 JS 方面:

function ShowModal() {
    InitModalEventsOnce();
    $('#MyModal').modal('show');
}

var InitModalEventsIsDone = false; // Flag to keep track of the subscribtion

function InitModalEventsOnce() {

    if (!InitModalEventsIsDone) {
        InitModalEventsIsDone = true;

        $('#MyModal').on('shown.bs.modal', function () {
            // something
        })

        $('#MyModal').on('hidden.bs.modal', function (e) {
            // something
        });
    }
}

就是这样!我找到的唯一可靠的解决方案。

答案 14 :(得分:0)

发生这种情况的原因可能是之前可能已执行了代码,但代码没有显示出来,因此您可以为其添加timeout()tp fire。

$(document).on('shown.bs.modal', function (event) {
      setTimeout(function(){
        alert("Hi");
      },1000); 
    });

答案 15 :(得分:0)

我使用了jQuery的事件委托/冒泡...对我有用。见下文:

$(document).on('click', '#btnSubmit', function () {
                alert('hi loo');
            })

信息也非常好:https://learn.jquery.com/events/event-delegation/

答案 16 :(得分:0)

确保您确实使用 bootstrap jQuery模式,而不是其他jquery模式。

在此上浪费了太多时间...

答案 17 :(得分:0)

在我的情况下,问题是travelsize的注释方式如何。bootstrap.js和jquery之间的导入顺序。因为我使用的是Metronic模板,并且之前没有检查

答案 18 :(得分:0)

以下是详细信息:

show.bs.modal在模型对话框加载时有效 显示.bs.modal在加载后工作做任何事情。后期渲染