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">×</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 ответов:
Что касается удаленной опции для модалов, от документы:
если указан удаленный 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">×</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>