【问题标题】:Twitter Bootstrap Modal Multiple event firingTwitter Bootstrap 模态多事件触发
【发布时间】:2013-02-14 10:50:32
【问题描述】:

这是一个奇怪的问题,我已经搜索了答案,但找不到适合我的代码的答案。

编辑:此问题发生在繁重的 Ajax 页面上,该页面未刷新且正在重用 Modal。

请注意我的 Javascript 有点弱,所以我可能错误地处理了这个问题

我发现了类似的问题herehere

两者都描述了我遇到的问题,但我只是更新了隐藏的调用视图。我没有绑定到按钮事件。

我定义了多个模态

    <div id="modal_small" class="modal hide fade in">
    </div>
    <div id="modal_large" class="modal hide fade in">
    </div>

我重复使用这些模式。因此 modal_large 会在一秒钟内显示一个创建表单,接下来会显示一个您可以从中选择的图像列表。

我使用以下脚本来渲染我的模态框,并传入要在每个实例中显示的视图

        function show_modal_large(href) {
            $.get(href, function (data) {
                $('#modal_large').html(data);
                $('#modal_large').modal('show');
            });
        };

我的目标是重用这些模式。我相信这就是问题所在

在要显示模态的视图的“$(document).ready”中,我调用此脚本绑定到模态的“隐藏”事件

    $('#modal_large').on('hidden', function () {
               // Make Ajax Call - THIS WORKS
    });

因此,您可以在视图上显示一个列表,显示您选择的图像。然后您打开一个模式并选择更多图像。在隐藏时,我更新调用表单上的选定图像。

一切正常。

问题:

我第一次打开模式并关闭它时,'on hidden' 事件会被触发一次。我第二次打开和关闭模式时,“隐藏”事件是两次调用,第三次是三次调用,依此类推。 如果我将模式用于具有不同“隐藏”事件的其他内容,则隐藏事件将调用 四次 次用于新隐藏事件,四次 次用于旧的隐藏事件。不久之后,我的系统就因所有的 ajax 调用而死机。

我错过了什么吗?我应该如何构建我的代码,以免发生这种情况?

【问题讨论】:

    标签: twitter-bootstrap


    【解决方案1】:

    好的,想通了……好吧。希望此代码对其他人有用。

    当我绑定到模式的“隐藏”事件时,每次创建它时,我只是添加另一个绑定,并再次调用所有以前的绑定。

    所以为了克服这个问题,我摆脱了旧的模态声明

    <div id="modal_small" class="modal hide fade in">
    </div>
    <div id="modal_large" class="modal hide fade in">
    </div>
    

    而不是它们,我动态创建模态,因为我需要它们,并为“隐藏”事件传递回调

          function show_modal_large(href, callback) {
                 // create guid to name of this Modal
                 var randomNum = guid();
                 // create element with guid id
                 var elementName = '#' + randomNum.toString();
                 $('body').append("<div id=" + randomNum + " class='modal hide fade in'></div>");
                 // create Modal and show
                 $.get(href, function (data) {
                     $(elementName).html(data);
                     // register call back to 'hidden' event
                     $(elementName).on('hidden', function () {
                         callback();
                         // clean up after hidden
                         $(elementName).unbind();
                         $(elementName).remove();
                     });
                     $(elementName).modal('show');
                 });
             };
    
             function s4() {
                 return Math.floor((1 + Math.random()) * 0x10000)
                            .toString(16)
                            .substring(1);
             };
    
             function guid() {
                 return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
                        s4() + '-' + s4() + s4() + s4();
             }
    

    我从Stackoverflow question here获得了 Guid 创建

    这对我很有用。并解决了我的问题。

    【讨论】:

      【解决方案2】:

      您也可以使用 .one 代替 .on 并且您绑定的事件只会触发一次。

      【讨论】:

      • 在上面的例子中,一个是行不通的,因为我实际上需要能够多次调用该事件
      猜你喜欢
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      相关资源
      最近更新 更多