Bootstrap 3 - 如何通过 AJAX 在模态正文中加载内容?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19663555/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-06 11:08:12  来源:igfitidea点击:

Bootstrap 3 - How to load content in modal body via AJAX?

ajaxtwitter-bootstraptwitter-bootstrap-3modal-dialog

提问by Thiezar

As you can see here, I have a button that launches a modal. Setting an href url for the button this url is automatically loaded into modal by Bootstrap 3. The fact is this page is loaded into modal root (as said in the bootstrap 3 documentation for modals usage). I want to load it into the modal-body instead.

正如你在这里看到的,我有一个启动模态的按钮。为按钮设置一个 href url 这个 url 会被 Bootstrap 3 自动加载到模态中。事实是这个页面被加载到模态根中(如bootstrap 3 文档中关于模态用法的说明)。我想将它加载到模态体中。

Is there a way to do it via attributes (not javascript)? Or what is the most automatic way to do it?

有没有办法通过属性(不是javascript)来做到这一点?或者最自动的方法是什么?

P.S. I remember in Bootstrap 2 the content was loaded in the body, not the root.

PS 我记得在 Bootstrap 2 中,内容加载在正文中,而不是根目录中。

采纳答案by alexcasalboni

Check this SO answerout.

检查这个 SO 答案

It looks like the only way is to provide the whole modal structure with your ajax response.

看起来唯一的方法是为整个模态结构提供 ajax 响应。

As you can check from the bootstrap source code, the load function is binded to the root element.

正如您可以从引导源代码中检查的那样,加载函数绑定到根元素。

In case you can't modify the ajax response, a simple workaround could be an explicit call of the $(..).modal(..)plugin on your body element, even though it will probably break the show/hide functions of the root element.

如果您无法修改 ajax 响应,一个简单的解决方法可能是$(..).modal(..)在您的 body 元素上显式调用插件,即使它可能会破坏根元素的显示/隐藏功能。

回答by marcovtwout

This is actually super simple with just a little bit of added javascript. The link's href is used as the ajax content source. Note that for Bootstrap 3.* we set data-remote="false"to disable the deprecated Bootstrap load function.

这实际上非常简单,只需添加一点点 javascript。链接的 href 用作 ajax 内容源。请注意,对于 Bootstrap 3.*,我们设置data-remote="false"为禁用已弃用的 Bootstrap 加载功能

JavaScript:

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 (based on the official example):

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>

Try it yourself: https://jsfiddle.net/ednon5d1/

自己试试:https: //jsfiddle.net/ednon5d1/

回答by Paul Marti

I guess you're searching for this custom function. It takes a data-toggle attribute and creates dynamically the necessary div to place the remote content. Just place the data-toggle="ajaxModal" on any link you want to load via AJAX.

我猜你正在寻找这个自定义函数。它采用 data-toggle 属性并动态创建必要的 div 来放置远程内容。只需将 data-toggle="ajaxModal" 放在要通过 AJAX 加载的任何链接上。

The JS part:

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

Finally, in the remote content, you need to put the entire structure to work.

最后,在远程内容中,您需要让整个结构发挥作用。

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

回答by Zim

In the case where you need to update the same modal with content from different Ajax / API callshere's a working solution.

如果您需要使用来自不同 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
Bootstrap 4 Demo

Bootstrap 3 演示
Bootstrap 4 演示

回答by Samuel Pinto

A simple way to use modals is with eModal!

使用模态的一种简单方法是使用eModal

Ex from github:

来自github的Ex :

  1. Link to eModal.js <script src="//rawgit.com/saribe/eModal/master/dist/eModal.min.js"></script>
  2. use eModal to display a modal for alert, ajax, prompt or confirm

    // Display an alert modal with default title (Attention)
    eModal.ajax('your/url.html');
    
  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>

回答by radx

create an empty modal box on the current page and below is the ajax call you can see how to fetch the content in result from another html page.

在当前页面上创建一个空的模式框,下面是 ajax 调用,您可以看到如何从另一个 html 页面获取结果中的内容。

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

        }});

once the call is done you will get the content of the page by the result to then you can insert the code in you modal's content id using.

调用完成后,您将通过结果获取页面的内容,然后您可以使用在模态的内容 ID 中插入代码。

You can call controller and get the page content and you can show that in your modal.

您可以调用控制器并获取页面内容,然后可以在模态中显示。

below is the example of Bootstrap 3 modal in that we are loading content from registration.html page...

下面是 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>