72

我刚刚使用新的 Twitter Bootstrap 版本开始了一个新项目:bootstrap 3。我无法让 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 -->

任何人都可以使这个简单的例子工作吗?

4

9 回答 9

112

关于模态的远程选项,来自文档

如果提供了远程 URL,内容将通过 jQuery 的 load 方法加载并注入到 modal element 的根目录中

这意味着您的远程文件应该提供完整的模态结构,而不仅仅是您想要在正文上显示的内容。

引导程序 3.1 更新:

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

看到这个演示小提琴

Boostrap 3.3 更新:

此选项自 v3.3.0 起已弃用,并已在 v4 中删除。我们建议改为使用客户端模板或数据绑定框架,或者自己调用jQuery.load

于 2013-08-22T17:58:49.360 回答
29

对于引导程序 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 分钟的修补时间。

于 2014-01-25T14:35:42.957 回答
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();
});
于 2013-08-27T11:06:34.253 回答
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 模态示例的仿制品:

<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 -->
于 2014-03-08T02:33:47.100 回答
9

我这样做了:

$('#myModal').on 'shown.bs.modal', (e) ->  
  $(e.target).find('.modal-body').load('http://yourserver.com/content')
于 2014-01-07T03:17:30.477 回答
8

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

// 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)
于 2013-09-03T18:26:12.383 回答
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>
于 2015-07-22T08:44:30.573 回答
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'),内容就会显示在模态框内

于 2016-11-23T08:11:43.133 回答
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>
于 2016-08-22T15:05:04.377 回答