Bootstrap 3 с дистанционным модальным


Я только что начал новый проект с новым выпуском Twitter Bootstrap: bootstrap 3. Я не могу заставить модальную работу работать в удаленном режиме. Я просто хочу, чтобы при нажатии на ссылку он показывает модальный с содержанием удаленного 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 -->

может кто-нибудь сделать этот простой пример работает ?

9 64

9 ответов:

Что касается удаленной опции для модалов, от документы:

если указан удаленный URL-адрес, содержимое будет загружено через загрузку jQuery метод и впрыснутый в корень модального элемента.

это означает, что ваш удаленный файл должен предоставить ладовые структуры, а не только то, что вы хотите отобразить на теле.

Обновление Bootstrap 3.1:

в v3. 1 выше поведение было изменено и теперь удаленный контент загружается в .modal-content

посмотреть этот демо-скрипка

3.3 Обновление Boostrap:

этот параметр является устаревшим с версии v3.3.0 и была удалена в версии V4. мы рекомендуем вместо этого использовать клиентские шаблоны или фреймворк привязки данных или вызывать jQuery.загрузить себя.

Для 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 минут возиться.

Если вы не хотите отправлять полную модальную структуру, вы можете повторить старое поведение, делая что-то вроде этого:

// 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();
});

вот мое решение (используя несколько выше), которое использует собственную структуру BS3 для восстановления старого поведения удаленной загрузки. Она должна быть бесшовной.

Я собираюсь сохранить переменную кода тяжелой и описательной, чтобы все было понятно. Я также предполагаю наличие JQuery. Javascript heavy lifter types позволит легко оптимизировать код.

для справки вот ссылка, которая вызывает модальный 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 -->

Я сделал так:

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

Как бы мне не нравилось изменять код начальной загрузки (делает обновление более сложным), вы можете просто добавить ".находить.'(modal-body') к оператору load в модальном режиме.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)

вот метод, который я использую. Он не требует каких-либо скрытых элементов 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
  }());

чтобы использовать, просто создайте тег a с href модального частичного:

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

еще один отличный и простой способ, чтобы иметь слеп модальный в вашем макете и вызвать его, если это необходимо.

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') и содержимое отображается внутри модального

Я делаю это так:

<!-- 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>