How to use AJAX loading with Bootstrap tabs?

后端 未结 10 1577
無奈伤痛
無奈伤痛 2020-12-02 08:30

I used bootstrap-tabs.js and it has worked perfectly.

But I didn\'t find information about how to load content through AJAX request.

So, how to use AJAX load

相关标签:
10条回答
  • 2020-12-02 09:06

    You can listen the change event and ajax load content in the event handler

    $('.tabs').bind('change', function (e) {
        var now_tab = e.target // activated tab
    
        // get the div's id
        var divid = $(now_tab).attr('href').substr(1);
    
        $.getJSON('xxx.php').success(function(data){
            $("#"+divid).text(data.msg);
        });
    })
    
    0 讨论(0)
  • 2020-12-02 09:14

    I suggest to put the uri into the tab-pane elements, it allows to take advantage of web frameworks reverse url fonctionnalities. It also allows to depend exclusively on the markup

    <ul class="nav nav-tabs" id="ajax_tabs">
      <li class="active"><a data-toggle="tab" href="#ajax_login">Login</a></li>
      <li><a data-toggle="tab" href="#ajax_registration">Registration</a></li>
    </ul>
    <div class="tab-content">
      <div class="tab-pane active" id="ajax_login"
        data-target="{% url common.views.ajax_login %}"></div>
      <div class="tab-pane" id="ajax_registration"
        data-target="{% url common.views.ajax_registration %}"></div>
    </div>
    

    And here is the javascript

    function show_tab(tab) {
        if (!tab.html()) {
            tab.load(tab.attr('data-target'));
        }
    }
    
    function init_tabs() {
        show_tab($('.tab-pane.active'));
        $('a[data-toggle="tab"]').on('show', function(e) {
            tab = $('#' + $(e.target).attr('href').substr(1));
            show_tab(tab);
        });
    }
    
    $(function () {
        init_tabs();
    });
    

    I loads the active tab, and loads a tab only if it is not already loaded

    0 讨论(0)
  • 2020-12-02 09:15

    I wanted to load fully dynamic php pages into the tabs through Ajax. For example, I wanted to have $_GET values in the links, based on which tab it was - this is useful if your tabs are dynamic, based on database data for example. Couldn't find anything that worked with it but I did manage to write some jQuery that actually works and does what I'm looking for. I'm a complete jQuery noob but here's how I did it.

    1. I created a new 'data-toggle' option called tabajax (instead of just tab), this allows me to seperate what's ajax and what's static content.
    2. I created a jQuery snippet that runs based on that data-toggle, it doesn't mess with the original code.

    I can now load say url.php?value=x into my Bootstrap Tabs.

    Feel free to use it if you want to, code is below

    jQuery code:

    $('[data-toggle="tabajax"]').click(function(e) {
        e.preventDefault()
        var loadurl = $(this).attr('href')
        var targ = $(this).attr('data-target')
        $.get(loadurl, function(data) {
            $(targ).html(data)
    
        });
        $(this).tab('show')
    });
    

    HTML:

    <li><a href="tabs/loadme.php?value=1" data-target='#val1' data-toggle="tabajax">Val 1</a></li>
    

    So here you can see that I've changed the way bootstrap loads thing, I use the href for the dynamic ajaxlink and then add a 'data-target' value to the link instead, that should be your target div (tab-content).

    So in your tab content section, you should then create an empty div called val1 for this example.

    Empty Div (target):

    <div class='tab-pane' id='val1'><!-- Ajax content will be loaded here--></div>
    

    Hope this is useful to someone :)

    0 讨论(0)
  • 2020-12-02 09:15

    This is an MVC example using Razor. It will interact with two partial views named: _SearchTab.cshtml and _SubmissionTab.cshtml

    Notice that I am naming the id of the tabs the same as the partials.

    Markup:

    <!-- Nav tabs -->
    <ul id="tabstrip" class="nav nav-tabs" role="tablist">
        <li class="active"><a href="#_SubmissionTab" role="tab" data-toggle="tab">Submission</a></li>
        <li><a href="#_SearchTab" role="tab" data-toggle="tab">Search</a></li>
    </ul>
    
    <!-- Tab panes -->
    <div class="tab-content">
        <div class="tab-pane fade in active" id="_SubmissionTab">@Html.Partial("_SubmissionTab")</div>
        <div class="tab-pane fade" id="_SearchTab"></div>
    </div>
    

    The @Html.Partial will request the page on the active tab on page load

    Script:

    <script>
        $('#tabstrip a').click(function (e) {
            e.preventDefault()
            var tabID = $(this).attr("href").substr(1);
            $("#" + tabID).load("/@ViewContext.RouteData.Values["controller"]/" + tabID)
            $(this).tab('show')
        })
    </script>
    

    The load function will perform an ajax request as each tab is clicked. As for what path is requested you will notice a @ViewContext.RouteData.Values["controller"] call. It simply gets the controller of the current view assuming the partial views are located there.

    Controller:

        public ActionResult _SubmissionTab()
        {
            return PartialView();
        }
    
        public ActionResult _SearchTab()
        {
            return PartialView();
        }
    

    The controller is needed to relay the load request to the proper partial view.

    0 讨论(0)
提交回复
热议问题