【问题标题】:Bootstrap modal in MVC, double backdrop - backdrop appearing twiceMVC 中的引导模式,双背景 - 背景出现两次
【发布时间】:2015-01-24 23:18:06
【问题描述】:

在使用 jQuery 生成引导模式时,我注意到了一个问题。在动态生成的局部视图(我的模式)中添加更多 javascript 会导致出现双背景。有谁知道为什么会这样?我正在使用 jquery-1.8.2.js 和 Bootstrap v3.1.1。非常感谢。

App.js

$(document).ready(function () {

$('.modal-button').on('click', function (e) {
    // Remove existing modals.
    $('.modal').remove();
    $.ajax({
        url: '/Ajax/GetSearchModal/',
        type: "get",
        cache: false,
        success: function (data) {
            var modal = $(data);
            $(data).modal({
                backdrop: 'static',
                keyboard: false,
            });
        }
    });
});

});

局部视图(我的模态)

@model MVCApp.Web.Models.ModalSearchModel
<div id="Ajax-Modal" class="modal fade" aria-hidden="true" role="dialog">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h3>
                    Select Something
                </h3>
            </div>
            @using (Html.BeginForm(Model.Action, Model.Controller, FormMethod.Post))
            { 
            <div class="modal-body">
                @Html.HiddenFor(m => m.SelectedDropDownID, new { @class     = "select-something-ddl", style = "width:100%", placeholder = "Search..." })
            </div>
            <div class="modal-footer">
                <button type="submit" value="Continue">Continue</button>
                <button type="button" value="Cancel" data-dismiss="modal">Cancel</button>
            </div>
            }
        </div>
    </div>
</div>
<script type="text/javascript">
    $(document).ready(function () {

        // This here causes the drop backdrop

        // select2 code here
    });
</script>

更新

将 javascript 从模式移动到成功处理程序对我想要实现的目标不起作用。我希望启动 select2 下拉列表。我可以让它在成功处理程序中工作的唯一方法是使用以下内容:

            modal.on('shown.bs.modal', function () {
                $('#SelectedDropDownID').select2({
                    ajax: {
                        url: '/Ajax/FetchResults/',
                        dataType: 'json',
                        delay: 250,
                        data: function (searchTerm) {
                            return { query: searchTerm };
                        },
                        results: function (data) {
                            return { results: data };
                        }
                    },
                    minimumInputLength: 2,
                    formatResult: formatRepo,
                    formatSelection: formatRepoSelection
                });

            });

但是,select2 激活存在延迟,因为显示的事件在模式完成动画进入屏幕之前不会触发。如果我在所示事件之外运行代码,则 select2 永远不会激活。

已解决

非常感谢 Pasha Zavoiskikh 和 cvrebert。我不得不更新 Bootstrap 和 jQuery 来修复双背景。根据 Pasha 的评论,在调用 select2 固定 select2 不触发之前将模式附加到正文。这是完整的修复:

function formatRepo(item) {
    var markup = "<table class='item-result'><tr>";
    if (item.text !== undefined) {
        markup += "<div class='item-name' data-jtext=" + item.text + " data-jid=" + item.id + ">" + item.text + "</div>";
    }
    markup += "</td></tr></table>"
    return markup;
}

function formatRepoSelection(item) {
    return item.text;
}


$('.modal-button).on('click', function (e) {
    // Delete existing modals.
    $('.modal').replaceWith('');
    // Get modal.
    $.ajax({
        url: '/Ajax/GetSearchModal/',
        type: "get",
        cache: false,
        success: function (data) {
            var modal = $(data);
            $('body').append(modal);
            $('#SelectedDropDownID').select2({
                ajax: {
                    url: '/Ajax/FetchResults/',
                    dataType: 'json',
                    delay: 250,
                    data: function (searchTerm) {
                        return { query: searchTerm };
                    },
                    results: function (data) {
                        return { results: data };
                    }
                },
                minimumInputLength: 2,
                formatResult: formatRepo,
                formatSelection: formatRepoSelection
            });

            modal.modal({
                backdrop: 'static',
                keyboard: false,
            });
        }
    });
});

【问题讨论】:

  • 只需将 js 从部分移动到成功处理程序
  • 您好,感谢您的快速回复。我已经更新了问题。
  • v3.1.1 已过时。请升级。
  • @Lionhart3001 您是否有理由通过 ajax 调用获取模式,而不是将其存储在页面上,然后显示它?
  • @Lionhart3001 即使有,我也会先将其附加到 DOM,初始化 select2,然后初始化 modal。

标签: jquery asp.net-mvc twitter-bootstrap modal-dialog


【解决方案1】:

这是我遇到的一篇旧帖子,因为这个问题仍然存在于 Bootstrap 中,提供我的意见以帮助追随我的人。

问题 - 关闭模式后仍然存在类“modal-backdrop”的单个 Div。

1) 为两个关闭按钮添加 btn-close 类:-

<div class="modal fade" id="myModal">
    <div class="modal-dialog">
      <div class="modal-content">

        <!-- Modal Header -->
        <div class="modal-header">
          <h4 class="modal-title">Modal Heading</h4>
          <button type="button"  class="close btn-close" data-dismiss="modal">&times;</button>
        </div>

        <!-- Modal body -->
        <div class="modal-body">
          Modal body..
        </div>

        <!-- Modal footer -->
        <div class="modal-footer">
          <button type="button"  class="btn btn-danger btn-close" data-dismiss="modal">Close</button>
        </div>

      </div>
    </div>
</div>

2) 在页面底部添加这个 Jquery :-

$(document).ready(function(){
        $('.btn-close').click(function(){
             $(".modal-backdrop").remove();
        });
 });

【讨论】:

    【解决方案2】:

    我的两分钱

    对我来说,去除淡入淡出是无效的 class 我最后做了一个小技巧

     $(document).on("DOMNodeRemoved",".modal-backdrop",function(){
        $(".modal-backdrop").remove();
     });
    

    让这个把戏不知道这样做是否有任何后果,但它的工作形式是我的班级褪色。

    【讨论】:

      【解决方案3】:

      通过将包含将由 javascript 重写的 id 的 &lt;div&gt; 放置在此处解决了问题,而不是部分视图。

      在您的情况下,包含 Modal 的部分视图将如下所示:

          @model MVCApp.Web.Models.ModalSearchModel
          <div class="modal-dialog">
              <div class="modal-content">
                  <div class="modal-header">
                      <h3>
                          Select Something
                      </h3>
                  </div>
                  @using (Html.BeginForm(Model.Action, Model.Controller, FormMethod.Post))
                  { 
                  <div class="modal-body">
                      @Html.HiddenFor(m => m.SelectedDropDownID, new { @class     = "select-something-ddl", style = "width:100%", placeholder = "Search..." })
                  </div>
                  <div class="modal-footer">
                      <button type="submit" value="Continue">Continue</button>
                      <button type="button" value="Cancel" data-dismiss="modal">Cancel</button>
                  </div>
                  }
              </div>
          </div>
      

      主页面中应放置以下 div:

      <div id="Ajax-Modal" class="modal fade" aria-hidden="true" role="dialog">
      

      【讨论】:

        【解决方案4】:

        在模式弹出窗口中执行一些操作后,我遇到了同样的问题,但背景永远不会关闭。

        任务逻辑:

        1. 将显示一个弹出窗口,让用户从图像列表中选择图像
        2. 用户选择图片后弹出模式应该关闭

        添加了一个名为 data-dismiss="modal" 的标签属性,修复了使用按钮选择图像的问题。

        【讨论】:

          【解决方案5】:

          当返回的 HTML 包含除模态 div 之外的其他 DOM 元素(例如某些 cmets)时,可能会发生这种情况。 所以正确的解决方法是替换

          var modal = $(data);
          

          var modal = $(data).filter('.modal');
          

          并确保modal.length === 1

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-12-24
            • 1970-01-01
            • 1970-01-01
            • 2016-09-08
            • 1970-01-01
            • 1970-01-01
            • 2017-01-30
            • 2015-01-18
            相关资源
            最近更新 更多