具有远程模式的Bootstrap 3


72

我刚刚使用新的Twitter Bootstrap版本启动了一个新项目:bootstrap3。我无法使Modal在远程模式下工作。我只想在单击链接时显示带有远程URL内容的模式。它可以工作,但模式布局已被完全破坏。

这是jsfiddle的链接:http : //jsfiddle.net/NUCgp/5/

编码 :

<a data-toggle="modal" href="http://fiddle.jshell.net/Sherbrow/bHmRB/0/show/" data-target="#myModal">Click me !</a>

<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                 <h4 class="modal-title">Modal title</h4>

            </div>
            <div class="modal-body"><div class="te"></div></div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                <button type="button" class="btn btn-primary">Save changes</button>
            </div>
        </div>
        <!-- /.modal-content -->
    </div>
    <!-- /.modal-dialog -->
</div>
<!-- /.modal -->

任何人都可以使这个简单的示例起作用吗?

Answers:


112

关于远程模式的选项,来自docs

如果提供了远程URL,将通过jQuery的load方法加载内容并将其注入modal元素的根

这意味着您的远程文件应该提供完整的模式结构,而不仅仅是您要在身体上显示的结构。

Bootstrap 3.1更新:

在v3.1中,上述行为已更改,现在将远程内容加载到 .modal-content

看到这个演示小提琴

Boostrap 3.3更新:

从v3.3.0开始不推荐使用此选项,并且在v4中已将其删除。我们建议改为使用客户端模板或数据绑定框架,或者自己调用jQuery.load


7
您无需将模式的内容放在原始页面上,只需将源本身放在上面即可。看到这里:jsfiddle.net/NUCgp/59
rybo111

12
为什么我为什么只需要为10个对话框复制所有相同的html 10次,因为它们会将html加载到modal-content而不是body中?他们愚蠢吗?
Pascal

1
我们如何根据远程内容更改模式大小?
Alex Jose

16
更新:“从v3.3.0开始不推荐使用此选项,并且将在v4中将其删除。我们建议改为使用客户端模板或数据绑定框架,或者自己调用jQuery.load。”
Thiago 2015年

6
我不明白为什么要弃用它……这是非常有用的,尽管折旧了,我还是想使用,改进它,使它工作(我实际上是这样做的)!对此有一些更深层次的解释,以决定制作一个插件是否是一个好主意,这将是很棒的……
Augustin Riedinger 17-2-21

29

对于Bootstrap 3

我必须处理的工作流程是使用可能会更改的url上下文加载内容。因此,默认情况下,使用javascript或href设置模式,以显示要显示的默认上下文:

$('#myModal').modal({
        show: false,
        remote: 'some/context'
});

销毁模式对我不起作用,因为我不是从同一远程加载,因此我必须:

$(".some-action-class").on('click', function () {
        $('#myModal').removeData('bs.modal');
        $('#myModal').modal({remote: 'some/new/context?p=' + $(this).attr('buttonAttr') });
        $('#myModal').modal('show');
});

当然,这很容易重构为js库,并为您提供了很多加载模式的灵活性

我希望这可以节省15分钟的时间。


不能100%确定原因-但在数据清理后我不得不清理DOM。添加以下行:$('#mymodal .modal-content')。html(“”);
Froyke

4
$('#myModal').on('hide.bs.modal', function () { $('#myModal').removeData('bs.modal'); $('#myModal .modal-content').html(''); }); 为我工作。
Scott Flack

18

如果您不想发送完整的模态结构,则可以复制旧的行为,例如:

// this is just an example, remember to adapt the selectors to your code!
$('.modal-link').click(function(e) {
    var modal = $('#modal'), modalBody = $('#modal .modal-body');

    modal
        .on('show.bs.modal', function () {
            modalBody.load(e.currentTarget.href)
        })
        .modal();
    e.preventDefault();
});

为什么不能按“ Escape”或单击背景以关闭对话框?默认情况下,键盘选项设置为true。
Warrio

14

这是我的解决方案(利用以上几点),该解决方案利用BS3自己的结构来恢复旧的远程加载行为。它应该是无缝的。

我将保持代码变量的重性和描述性,以使事情易于理解。我还假设存在JQuery。JavaScript重型起重器类型将方便地简化代码。

作为参考,下面是一个调用BS3模态的链接:

<li><a data-toggle="modal" href="terms.html" data-target="#terms">Terms of Use</a></li>

在您的Javascript中,您将需要以下内容。

// Make sure the DOM elements are loaded and accounted for
$(document).ready(function() {

  // Match to Bootstraps data-toggle for the modal
  // and attach an onclick event handler
  $('a[data-toggle="modal"]').on('click', function(e) {

    // From the clicked element, get the data-target arrtibute
    // which BS3 uses to determine the target modal
    var target_modal = $(e.currentTarget).data('target');
    // also get the remote content's URL
    var remote_content = e.currentTarget.href;

    // Find the target modal in the DOM
    var modal = $(target_modal);
    // Find the modal's <div class="modal-body"> so we can populate it
    var modalBody = $(target_modal + ' .modal-body');

    // Capture BS3's show.bs.modal which is fires
    // immediately when, you guessed it, the show instance method
    // for the modal is called
    modal.on('show.bs.modal', function () {
            // use your remote content URL to load the modal body
            modalBody.load(remote_content);
        }).modal();
        // and show the modal

    // Now return a false (negating the link action) to prevent Bootstrap's JS 3.1.1
    // from throwing a 'preventDefault' error due to us overriding the anchor usage.
    return false;
  });
});

我们就在那里。您可能想做的一件事是以最大高度设置模态主体的样式,以便长内容滚动。

在CSS中,您需要以下内容:

.modal-body{
    max-height: 300px;
    overflow-y: scroll;
}

仅供参考,我将包括模态的HTML,它是您所见过的每个Bootsrap Modal Example的一部分:

<div id="terms" class="modal fade">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        <h3 id="termsLabel" class="modal-title">TERMS AND CONDITIONS</h3>
      </div>
      <div class="modal-body">
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
      </div>
    </div><!-- /.modal-content -->
  </div><!-- /.modal-dialog -->
</div><!-- /.modal -->

3
这样可以防止加载非远程模态。我将其添加到点击处理程序中进行修复。var href = e.currentTarget.getAttribute('href'); if (!href || href.indexOf('#') === 0) { return; }
乍得冯瑙2014年

谢谢,这对我帮助很大。
jj2 2014年

1
我注意到show.bs.modal事件正在堆叠,所以我modal.off('show.bs.modal');在之前添加了modal.on
Corie Slate 2014年

是否知道如何使用jQuery将该<a>标记链接作为目标,因此它将使用指定的URL?
Koffeehaus,2015年

我的网页中有多个使用一种模式的网址。您的代码解决了我的一个问题,但是当我单击第一个链接时,我打开的任何其他链接都将带我到我单击的第一个模态URL。你能帮我解决这个问题吗?
比科

9

我这样做:

$('#myModal').on 'shown.bs.modal', (e) ->  
  $(e.target).find('.modal-body').load('http://yourserver.com/content')

我认为这是其中最好的解决方案。
Rajan Rawal 2015年

依靠。如果您的应用程序使用率很高,这将使您编写越来越多的JS。但是在少数情况下,这是完美的选择
udit mittal

8

尽管我不喜欢修改Bootstrap代码(使升级更加困难),但您可以简单地在modal.js中的load语句中添加“ .find('。modal-body'),如下所示:

// original code
// if (this.options.remote) this.$element.load(this.options.remote)

// modified code
if (this.options.remote) this.$element.find('.modal-body').load(this.options.remote)

5

这是我使用的方法。它不需要页面上任何隐藏的DOM元素,只需要带有模式部分的href的锚标记和“ modalTrigger”类。当模式关闭(隐藏)时,将其从DOM中删除。

  (function(){
        // Create jQuery body object
        var $body = $('body'),

        // Use a tags with 'class="modalTrigger"' as the triggers
        $modalTriggers = $('a.modalTrigger'),

        // Trigger event handler
        openModal = function(evt) {
              var $trigger = $(this),                  // Trigger jQuery object

              modalPath = $trigger.attr('href'),       // Modal path is href of trigger

              $newModal,                               // Declare modal variable

              removeModal = function(evt) {            // Remove modal handler
                    $newModal.off('hidden.bs.modal');  // Turn off 'hide' event
                    $newModal.remove();                // Remove modal from DOM
              },

              showModal = function(data) {             // Ajax complete event handler
                    $body.append(data);                // Add to DOM
                    $newModal = $('.modal').last();    // Modal jQuery object
                    $newModal.modal('show');           // Showtime!
                    $newModal.on('hidden.bs.modal',removeModal); // Remove modal from DOM on hide
              };

              $.get(modalPath,showModal);             // Ajax request

              evt.preventDefault();                   // Prevent default a tag behavior
        };

        $modalTriggers.on('click',openModal);         // Add event handlers
  }());

要使用,只需创建一个带有模式部分的href的标签:

<a href="path/to/modal-partial.html" class="modalTrigger">Open Modal</a>

这是优秀的布兰登·菲茨帕特里克。我正在调用ASP.Net MVC部分视图,该视图已加载并能够显示该弹出窗口。我有一个问题,我的jQuery代码未绑定到我的按钮,文本框。您能告诉我如何将按钮单击事件分配给按钮吗?我在我的partialview.cshtml中完成了如下操作:<script> $(document).ready(function(){alert('doc ready'); $(' #btnSaveComment')。click(function(){alert('something');});)}; </ script>
Karthikeyan 2015年

不看更多代码就很难说,但是这里有一些建议。我假设您的button和script标签都在模式内容内。1.确保在注册click事件之前已呈现#btnSaveComment元素。如果$('#btnSaveComment')。length === 0,则该元素尚未添加到DOM。2.如果请求的文档的mime类型不是text / html,则jquery将不会评估加载的脚本。如果是这种情况,请使用较低级别的$ .ajax()函数(而不是$ .get())将其指定为html。(stackoverflow.com/a/2203816/856389)。
布兰登·菲茨帕特里克

5

另一个简便的好方法是在布局中添加一个模,并在需要时调用它。

JS

  var remote_modal = function(url) {
    // reset modal body with a spinner or empty content
    spinner = "<div class='text-center'><i class='fa fa-spinner fa-spin fa-5x fa-fw'></i></div>"

    $("#remote-modal .modal-body").html(spinner)
    $("#remote-modal .modal-body").load(url);
    $("#remote-modal").modal("show");
  }

和你的HTML

 <div class='modal fade' id='remote-modal'>
    <div class='modal-dialog modal-lg'>
      <div class='modal-content'>
        <div class='modal-body'></div>
        <div class='modal-footer'>
          <button class='btn btn-default'>Close</button>
        </div>
      </div>
    </div>
  </div>
</body>

现在您只需调用即可remote_modal('/my/url.html')将内容显示在模式内部


0

我这样做:

<!-- global template loaded in all pages // -->
     <div id="NewsModal" class="modal fade" tabindex="-1" role="dialog" data-ajaxload="true" aria-labelledby="newsLabel" aria-hidden="true">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                        <h3 class="newsLabel"></h3>
                    </div>
                    <div class="modal-body">
                            <div class="loading">
                                <span class="caption">Loading...</span>
                               <img src="/images/loading.gif" alt="loading">
                        </div>
                    </div>
                    <div class="modal-footer caption">
                        <button class="btn btn-right default modal-close" data-dismiss="modal">Close</button>
                    </div>
                </div>
            </div>
        </div>

这是我的href:

<a href="#NewsModal" onclick="remote=\'modal_newsfeed.php?USER='.trim($USER).'&FUNCTION='.trim(urlencode($FUNCTIONCODE)).'&PATH_INSTANCE='.$PATH_INSTANCE.'&ALL=ALL\'
                                        remote_target=\'#NewsModal .modal-body\'" role="button" data-toggle="modal">See All Notifications <i class="m-icon-swapright m-icon-dark"></i></a>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.