Bootstrap 3 - Як завантажити вміст у модальне тіло через AJAX?


76

Як ви можете бачити тут , у мене є кнопка, яка запускає модальний. Встановлюючи URL-адресу href для кнопки, ця URL-адреса автоматично завантажується в модальний за допомогою Bootstrap 3. Справа в тому, що ця сторінка завантажується в модальний корінь (як зазначено в документації до bootstrap 3 для використання модалів ). Натомість я хочу завантажити його в модальне тіло.

Чи є спосіб зробити це за допомогою атрибутів (не javascript)? Або який найавтоматичніший спосіб це зробити?

PS Я пам’ятаю, у Bootstrap 2 вміст завантажувався в тіло, а не в корінь.

Відповіді:


35

Перевірте цю ТАКУ відповідь .

Схоже, єдиний спосіб - це надати всій модальній структурі свою відповідь ajax.

Як ви можете перевірити з вихідного коду bootstrap , функція завантаження прив'язана до кореневого елемента.

Якщо ви не можете змінити відповідь ajax, простим обхідним шляхом може бути явний виклик $(..).modal(..)плагіна для вашого елемента body, хоча це, ймовірно, порушить функції show / hide кореневого елемента.


95

Це насправді надзвичайно просто, лише трохи додавши JavaScript. Href посилання використовується як джерело вмісту ajax. Зауважте, що для Bootstrap 3. * ми встановили data-remote="false"вимкнення застарілої функції завантаження Bootstrap .

JavaScript:

// Fill modal with content from link href
$("#myModal").on("show.bs.modal", function(e) {
    var link = $(e.relatedTarget);
    $(this).find(".modal-body").load(link.attr("href"));
});

HTML (на основі офіційного прикладу ):

<!-- Link trigger modal -->
<a href="remoteContent.html" data-remote="false" data-toggle="modal" data-target="#myModal" class="btn btn-default">
    Launch Modal
</a>

<!-- Default bootstrap modal example -->
<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-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        ...
      </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>
  </div>
</div>

Спробуйте самі: https://jsfiddle.net/ednon5d1/


5
У найновішому Bootrat loadфункція була вилучена і про це йдеться у документах Boostrap: Ця опція застаріла з версії 3.3.3 і буде видалена у версії v4. Замість цього ми рекомендуємо використовувати шаблони на стороні клієнта, фреймворк прив'язки даних або самостійно викликати jQuery.load. хотів би побачити оновлену версію для цього
JasonDavis

16
Чи коментували ви неправильну відповідь? Ця відповідь робить саме це. ;)
marcovtwout

1
Це ініціює 2x дзвінки ajax у Bootstrap v3. Один для початкового завантаження Modal AJAX - і один для вашої show.bs.modalподії (який запускається після вихідного дзвінка ajax).
Лоуренс,

6
Дякуємо, що помітили це. Офіційні документи тут були не дуже чіткими - тепер я спеціально відключив оригінальне завантаження data-remote="false"та додав JSfiddle. У Bootstrap 4 це більше не потрібно.
marcovtwout

Чи є простий спосіб встановити модальний заголовок теж? Першою думкою було зробити другий дзвінок ajax, але це не приємно ...
Хокаща,

16

Я думаю, ви шукаєте цю спеціальну функцію. Він приймає атрибут перемикання даних і створює динамічно необхідний div для розміщення віддаленого вмісту. Просто помістіть data-toggle = "ajaxModal" на будь-яке посилання, яке ви хочете завантажити через AJAX.

Частина JS:

$('[data-toggle="ajaxModal"]').on('click',
              function(e) {
                $('#ajaxModal').remove();
                e.preventDefault();
                var $this = $(this)
                  , $remote = $this.data('remote') || $this.attr('href')
                  , $modal = $('<div class="modal" id="ajaxModal"><div class="modal-body"></div></div>');
                $('body').append($modal);
                $modal.modal({backdrop: 'static', keyboard: false});
                $modal.load($remote);
              }
            );

Нарешті, у віддаленому вмісті вам потрібно застосувати всю структуру до роботи.

<div class="modal-dialog">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal">&times;</button>
            <h4 class="modal-title"></h4>
        </div>
        <div class="modal-body">
        </div>
        <div class="modal-footer">
            <a href="#" class="btn btn-white" data-dismiss="modal">Close</a>
            <a href="#" class="btn btn-primary">Button</a>
            <a href="#" class="btn btn-primary">Another button...</a>
        </div>
    </div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->

Це саме те, що я роблю зараз, за ​​винятком того, що у мене є функції modal_create_head і modal_create_foot, а потім я кидаю будь-яке повернення ajax між ними. Я думав, це буде швидше, ніж завантаження html у вікно ajax, оскільки ваш файл .js буде кешований стороною клієнта та продовжуватиме використовувати його повторно, ні? Чому люди завантажують .html замість того, щоб повертати всі HTML-коди в Json, Text або HTML, завантаження HTML відбувається швидше?
Someone Special

13

У випадку, коли вам потрібно оновити один і той же модаль із вмістом з різних викликів Ajax / API, ось робоче рішення.

$('.btn-action').click(function(){
    var url = $(this).data("url"); 
    $.ajax({
        url: url,
        dataType: 'json',
        success: function(res) {

            // get the ajax response data
            var data = res.body;

            // update modal content here
            // you may want to format data or 
            // update other modal elements here too
            $('.modal-body').text(data);

            // show modal
            $('#myModal').modal('show');

        },
        error:function(request, status, error) {
            console.log("ajax call went wrong:" + request.responseText);
        }
    });
});

Демонстрація
Bootstrap 3 Demo


Приємно, чисто та ефективно! Рекомендовано також.
неофіт

5

Простий спосіб використання модалів - це eModal !

Ex з github :

  1. Посилання на eModal.js <script src="//rawgit.com/saribe/eModal/master/dist/eModal.min.js"></script>
  2. використовуйте eModal для відображення модального сигналу для попередження, ajax, запиту чи підтвердження

    // Display an alert modal with default title (Attention)
    eModal.ajax('your/url.html');
    

$(document).ready(function () {/* activate scroll spy menu */

    var iconPrefix = '.glyphicon-';


    $(iconPrefix + 'cloud').click(ajaxDemo);
    $(iconPrefix + 'comment').click(alertDemo);
    $(iconPrefix + 'ok').click(confirmDemo);
    $(iconPrefix + 'pencil').click(promptDemo);
    $(iconPrefix + 'screenshot').click(iframeDemo);
    ///////////////////* Implementation *///////////////////

    // Demos
    function ajaxDemo() {
        var title = 'Ajax modal';
        var params = {
            buttons: [
               { text: 'Close', close: true, style: 'danger' },
               { text: 'New content', close: false, style: 'success', click: ajaxDemo }
            ],
            size: eModal.size.lg,
            title: title,
            url: 'http://maispc.com/app/proxy.php?url=http://loripsum.net/api/' + Math.floor((Math.random() * 7) + 1) + '/short/ul/bq/prude/code/decorete'
        };

        return eModal
            .ajax(params)
            .then(function () { alert('Ajax Request complete!!!!', title) });
    }

    function alertDemo() {
        var title = 'Alert modal';
        return eModal
            .alert('You welcome! Want clean code ?', title)
            .then(function () { alert('Alert modal is visible.', title); });
    }

    function confirmDemo() {
        var title = 'Confirm modal callback feedback';
        return eModal
            .confirm('It is simple enough?', 'Confirm modal')
            .then(function (/* DOM */) { alert('Thank you for your OK pressed!', title); })
            .fail(function (/*null*/) { alert('Thank you for your Cancel pressed!', title) });
    }

    function iframeDemo() {
        var title = 'Insiders';
        return eModal
            .iframe('https://www.youtube.com/embed/VTkvN51OPfI', title)
            .then(function () { alert('iFrame loaded!!!!', title) });
    }

    function promptDemo() {
        var title = 'Prompt modal callback feedback';
        return eModal
            .prompt({ size: eModal.size.sm, message: 'What\'s your name?', title: title })
            .then(function (input) { alert({ message: 'Hi ' + input + '!', title: title, imgURI: 'https://avatars0.githubusercontent.com/u/4276775?v=3&s=89' }) })
            .fail(function (/**/) { alert('Why don\'t you tell me your name?', title); });
    }

    //#endregion
});
.fa{
  cursor:pointer;
 }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://rawgit.com/saribe/eModal/master/dist/eModal.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>


<link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.3.5/united/bootstrap.min.css" rel="stylesheet" >
<link href="http//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">

<div class="row" itemprop="about">
	<div class="col-sm-1 text-center"></div>
	<div class="col-sm-2 text-center">
		<div class="row">
			<div class="col-sm-10 text-center">
				<h3>Ajax</h3>
				<p>You must get the message from a remote server? No problem!</p>
				<i class="glyphicon glyphicon-cloud fa-5x pointer" title="Try me!"></i>
			</div>
		</div>
	</div>
	<div class="col-sm-2 text-center">
		<div class="row">
			<div class="col-sm-10 text-center">
				<h3>Alert</h3>
				<p>Traditional alert box. Using only text or a lot of magic!?</p>
				<i class="glyphicon glyphicon-comment fa-5x pointer" title="Try me!"></i>
			</div>
		</div>
	</div>

	<div class="col-sm-2 text-center">
		<div class="row">
			<div class="col-sm-10 text-center">
				<h3>Confirm</h3>
				<p>Get an okay from user, has never been so simple and clean!</p>
				<i class="glyphicon glyphicon-ok fa-5x pointer" title="Try me!"></i>
			</div>
		</div>
	</div>
	<div class="col-sm-2 text-center">
		<div class="row">
			<div class="col-sm-10  text-center">
				<h3>Prompt</h3>
				<p>Do you have a question for the user? We take care of it...</p>
				<i class="glyphicon glyphicon-pencil fa-5x pointer" title="Try me!"></i>
			</div>
		</div>
	</div>
	<div class="col-sm-2 text-center">
		<div class="row">
			<div class="col-sm-10  text-center">
				<h3>iFrame</h3>
				<p>IFrames are hard to deal with it? We don't think so!</p>
				<i class="glyphicon glyphicon-screenshot fa-5x pointer" title="Try me!"></i>
			</div>
		</div>
	</div>
	<div class="col-sm-1 text-center"></div>
</div>


Приємно використовувати його, але повний реальний приклад коду (можливо, usine jsfiddle.net) буде цікавішим.
Майк Кастро Демарія

1
Привіт, Майк, подивись пост-версію ... Я додав повну демонстрацію з офіційного сайту
Самуель Пінто

3

створіть порожнє модальне поле на поточній сторінці, а нижче - виклик ajax, ви можете побачити, як отримати вміст у результаті з іншої сторінки html.

 $.ajax({url: "registration.html", success: function(result){
            //alert("success"+result);
              $("#contentBody").html(result);
            $("#myModal").modal('show'); 

        }});

як тільки дзвінок буде зроблено, ви отримаєте вміст сторінки за результатом, після чого ви зможете вставити код у свій ідентифікатор вмісту модалу, використовуючи.

Ви можете зателефонувати контролеру і отримати вміст сторінки, і ви можете показати це у своєму модалі.

нижче - приклад модального способу Bootstrap 3 в тому, що ми завантажуємо вміст зі сторінки registration.html ...

index.html
------------------------------------------------
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<script type="text/javascript">
function loadme(){
    //alert("loadig");

    $.ajax({url: "registration.html", success: function(result){
        //alert("success"+result);
          $("#contentBody").html(result);
        $("#myModal").modal('show'); 

    }});
}
</script>
</head>
<body>

<!-- Trigger the modal with a button -->
<button type="button" class="btn btn-info btn-lg" onclick="loadme()">Load me</button>


<!-- Modal -->
<div id="myModal" class="modal fade" role="dialog">
  <div class="modal-dialog">

    <!-- Modal content-->
    <div class="modal-content" >
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">&times;</button>
        <h4 class="modal-title">Modal Header</h4>
      </div>
      <div class="modal-body" id="contentBody">

      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
      </div>
    </div>

  </div>
</div>

</body>
</html>

registration.html
-------------------- 
<!DOCTYPE html>
<html>
<style>
body {font-family: Arial, Helvetica, sans-serif;}

form {
    border: 3px solid #f1f1f1;
    font-family: Arial;
}

.container {
    padding: 20px;
    background-color: #f1f1f1;
    width: 560px;
}

input[type=text], input[type=submit] {
    width: 100%;
    padding: 12px;
    margin: 8px 0;
    display: inline-block;
    border: 1px solid #ccc;
    box-sizing: border-box;
}

input[type=checkbox] {
    margin-top: 16px;
}

input[type=submit] {
    background-color: #4CAF50;
    color: white;
    border: none;
}

input[type=submit]:hover {
    opacity: 0.8;
}
</style>
<body>

<h2>CSS Newsletter</h2>

<form action="/action_page.php">
  <div class="container">
    <h2>Subscribe to our Newsletter</h2>
    <p>Lorem ipsum text about why you should subscribe to our newsletter blabla. Lorem ipsum text about why you should subscribe to our newsletter blabla.</p>
  </div>

  <div class="container" style="background-color:white">
    <input type="text" placeholder="Name" name="name" required>
    <input type="text" placeholder="Email address" name="mail" required>
    <label>
      <input type="checkbox" checked="checked" name="subscribe"> Daily Newsletter
    </label>
  </div>

  <div class="container">
    <input type="submit" value="Subscribe">
  </div>
</form>

</body>
</html>

будь ласка, не використовуйте формат коду для пояснення коду - відокремте їх
nj2237
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.