Bootstrap 3 - Wie lade ich Inhalte über AJAX in den Modal Body?

75

Wie Sie hier sehen können , habe ich eine Schaltfläche, mit der ein Modal gestartet wird. Festlegen einer href-URL für die Schaltfläche Diese URL wird von Bootstrap 3 automatisch in modal geladen. Tatsache ist, dass diese Seite in modal root geladen wird (wie in der Bootstrap 3-Dokumentation für die Verwendung von Modals angegeben ). Ich möchte es stattdessen in den Modalkörper laden.

Gibt es eine Möglichkeit, dies über Attribute (nicht Javascript) zu tun? Oder wie geht das am automatischsten?

PS Ich erinnere mich, dass in Bootstrap 2 der Inhalt in den Body geladen wurde, nicht in den Root.

Thiezar
quelle

Antworten:

35

Überprüfen Sie diese SO Antwort aus.

Es sieht so aus, als ob die einzige Möglichkeit darin besteht, die gesamte Modalstruktur mit Ihrer Ajax-Antwort zu versehen.

Wie Sie anhand des Bootstrap- Quellcodes überprüfen können, ist die Ladefunktion an das Stammelement gebunden.

Falls Sie die Ajax-Antwort nicht ändern können, kann eine einfache Problemumgehung ein expliziter Aufruf des $(..).modal(..)Plugins für Ihr Body-Element sein, obwohl dadurch wahrscheinlich die Show / Hide-Funktionen des Root-Elements unterbrochen werden.

alexcasalboni
quelle
95

Dies ist eigentlich super einfach mit nur ein bisschen zusätzlichem Javascript. Die href des Links wird als Ajax-Inhaltsquelle verwendet. Beachten Sie, dass wir für Bootstrap 3. * data-remote="false"die veraltete Bootstrap-Ladefunktion deaktivieren .

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 (basierend auf dem offiziellen Beispiel ):

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

Probieren Sie es selbst aus: https://jsfiddle.net/ednon5d1/

marcovtwout
quelle
5
Im neuesten Bootrat wurde die loadFunktion deaktiviert und in den Boostrap-Dokumenten wie folgt angegeben: Diese Option ist seit Version 3.3.0 veraltet und wird in Version 4 entfernt. Wir empfehlen, stattdessen clientseitiges Templating oder ein Datenbindungsframework zu verwenden oder jQuery.load selbst aufzurufen. würde gerne eine aktualisierte Version dafür sehen
JasonDavis
16
Haben Sie die falsche Antwort kommentiert? Diese Antwort macht genau das. ;)
Marcovtwout
1
Dies löst 2x Ajax-Aufrufe in Bootstrap v3 aus. Eine für die ursprüngliche Modal AJAX-Last - und eine für Ihre show.bs.modalVeranstaltung (die nach dem ursprünglichen Ajax-Aufruf ausgelöst wird ).
Laurence
6
Danke, dass du das bemerkt hast. Die offiziellen Dokumente waren hier nicht sehr klar - ich habe jetzt speziell das ursprüngliche Laden deaktiviert data-remote="false"und eine JSfiddle hinzugefügt. In Bootstrap 4 sollte dies nicht mehr benötigt werden.
Marcovtwout
Gibt es auch eine einfache Möglichkeit, den Modaltitel festzulegen? Der erste Gedanke war, einen zweiten Ajax-Anruf zu tätigen, aber das ist nicht schön ...
Hokascha
16

Ich denke, Sie suchen nach dieser benutzerdefinierten Funktion. Es verwendet ein Datenumschaltattribut und erstellt dynamisch das erforderliche div, um den Remote-Inhalt zu platzieren. Platzieren Sie einfach den data-toggle = "ajaxModal" auf einem beliebigen Link, den Sie über AJAX laden möchten.

Der JS-Teil:

$('[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);
              }
            );

Schließlich müssen Sie im Remote-Inhalt die gesamte Struktur zum Laufen bringen.

<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 -->
Paul Marti
quelle
Dies ist genau die Art und Weise, wie ich es jetzt mache, außer dass ich eine modal_create_head- und eine modal_create_foot-Funktion habe und dann die Ajax-Rückkehr dazwischen werfe. Ich dachte, dies wäre schneller als das Laden eines HTML-Codes in die Ajax-Box, da Ihre .js-Datei vom Client zwischengespeichert wird und weiterhin verwendet wird, nicht wahr? Warum wird HTML schneller geladen, wenn Benutzer HTML-Codes laden, anstatt alle HTML-Codes in Json, Text oder HTML zurückzugeben?
Jemand Besonderes
13

Für den Fall, dass Sie dasselbe Modal mit Inhalten aus verschiedenen Ajax / API-Aufrufen aktualisieren müssen, finden Sie hier eine funktionierende Lösung.

$('.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
Bootstrap 4 Demo

Zim
quelle
Schön, sauber und effektiv! Empfohlen auch.
Neophyte
5

Eine einfache Möglichkeit, Modalitäten zu verwenden, ist eModal !

Ex von Github :

  1. Link zu eModal.js <script src="//rawgit.com/saribe/eModal/master/dist/eModal.min.js"></script>
  2. Verwenden Sie eModal, um ein Modal für Alarm, Ajax, Eingabeaufforderung oder Bestätigung anzuzeigen

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

Samuel Pinto
quelle
Sieht gut aus, um es zu verwenden, aber ein vollständiges Beispiel für Code (vielleicht mit jsfiddle.net) wird interessanter sein.
Mike Castro Demaria
1
Hallo Mike, werfen Sie einen Blick in die Post-Ausgabe ... Ich habe eine vollständige Demo von der offiziellen Website hinzugefügt
Samuel Pinto
3

Erstellen Sie ein leeres modales Feld auf der aktuellen Seite. Unten sehen Sie den Ajax-Aufruf, mit dem Sie sehen können, wie Sie den Inhalt des Ergebnisses von einer anderen HTML-Seite abrufen.

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

        }});

Sobald der Aufruf abgeschlossen ist, erhalten Sie den Inhalt der Seite anhand des Ergebnisses. Anschließend können Sie den Code mit in die Inhalts-ID Ihres Modals einfügen.

Sie können den Controller anrufen und den Seiteninhalt abrufen und dies in Ihrem Modal anzeigen.

Im Folgenden finden Sie ein Beispiel für das Bootstrap 3-Modal, bei dem Inhalte von der Seite register.html geladen werden ...

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>
radx
quelle
Bitte verwenden Sie nicht das Code-Format zur Erklärung des Codes - trennen Sie sie
nj2237