Aktivierung der Bootstrap-Registerkarte mit JQuery


73

Ich habe den folgenden Code

<ul class="nav nav-tabs">
    <li><a href="#aaa" data-toggle="tab">AAA</a></li>
    <li><a href="#bbb" data-toggle="tab">BBB</a></li>
    <li><a href="#ccc" data-toggle="tab">CCC</a></li>
</ul>
<div class="tab-content" id="tabs">
    <div class="tab-pane" id="aaa">...Content...</div>
    <div class="tab-pane" id="bbb">...Content...</div>
    <div class="tab-pane" id="ccc">...Content...</div>
</div>

Und das folgende Skript

$(document).ready(function(){
    activaTab('aaa');
});

function activaTab(tab){
    $('.tab-pane a[href="#' + tab + '"]').tab('show');
};

In diesem Fall, wenn die Seite fertig ist, wird die zweite Registerkarte aktiviert, aber ich bekomme immer einen JavaScript-Fehler in der Zeile $('.tab-pane a[href="#' + tab + '"]').tab();

Kann mir bitte jemand helfen?


1
Was für einen Fehler hast du?
Oyeme

Ich denke du wolltest $('.nav-tabs a[href="#' + tab + '"]').tab('show');, richtig? Außerdem kann ids nicht mit einer Zahl beginnen.
Petr R.

1
Warum Sie nicht bootstrap.js verwenden? Fügen Sie einfach boostrap.js in Ihr HTML ein
codedme

Der Fehler ist, dass das Objekt diese Eigenschaft oder Methode nicht akzeptiert. Die IDs auf meiner Seite beginnen nicht mit einer Nummer. Es war mein Fehler, es ist nur ein Beispiel. Bootstrap.js ist in der Seite enthalten
user2607411

$ ('. nav-tabs a [href = "#' + tab + '"]'). tab ('show'); hat nicht funktioniert. Ich bearbeite den Beitrag mit den geänderten IDs
user2607411

Antworten:


172

Das Anwenden eines Selektors aus dem .nav-tabsscheint zu funktionieren: Siehe diese Demo .

$(document).ready(function(){
    activaTab('aaa');
});

function activaTab(tab){
    $('.nav-tabs a[href="#' + tab + '"]').tab('show');
};

Ich würde die Antwort von @ codedme vorziehen, da Sie, wenn Sie vor dem Laden der Seite wissen, welche Registerkarte Sie möchten, wahrscheinlich das Seiten-HTML ändern und JS für diese bestimmte Aufgabe nicht verwenden sollten.

Ich habe auch die Demo für seine Antwort optimiert .

(Wenn dies bei Ihnen nicht funktioniert, geben Sie bitte Ihre Einstellung an - Browser, Umgebung usw.)


zusammen mit Bootstrap. In der Vorlage füge ich alle Bootstrap-Js (einschließlich jquery.js) hinzu. Kann ich bei diesen Importen Probleme haben? Andere Bootstrap-Komponenten wie das Modal Panel funktionieren
einwandfrei

Haben Sie eine Live-Version Ihrer Seite?
MasterAM

Entschuldigung, MasterAM hat keine Live-Version. Scheint, dass ich ein Problem mit bootstrap.js habe. Ich habe auf meiner Seite jquery.js, bootstrap.js und jsf und richfaces js hinzugefügt. Alle Verweise auf .tab () geben immer einen js-Fehler zurück
user2607411

Versuchen Sie, einige Teile zu entfernen, bis Sie das entsprechende Segment der Seite erhalten. Mit einem kleineren Teil der Seite sollte es für Sie dann einfacher sein, den Grund zu identifizieren, warum die Dinge nicht funktionieren.
MasterAM

1
Ich habe Ihre jsFiddles aktualisiert, da sich die Bootstrap-URL geändert hat, seit Sie diese Antwort gepostet haben.
Mike

24

Klicken Sie auf den Link zum Registerkartenanker, wenn die Seite fertig ist

$('a[href="' + window.location.hash + '"]').trigger('click');

Oder in Vanille-JavaScript

document.querySelector('a[href="' + window.location.hash + '"]').click();

Einfache Lösung und direkt zum Punkt. Wenn Sie Probleme haben, verpacken Sie es in eine dokumentbereite Funktion. dh$(document).ready(function(){ $('a[href="' + window.location.hash + '"]').trigger('click'); });
Julius


10
<div class="tabbable">
<ul class="nav nav-tabs">
    <li class="active"><a href="#aaa" data-toggle="tab">AAA</a></li>
    <li><a href="#bbb" data-toggle="tab">BBB</a></li>
    <li><a href="#ccc" data-toggle="tab">CCC</a></li>
</ul>
<div class="tab-content" id="tabs">
    <div class="tab-pane fade active in" id="aaa">...Content...</div>
    <div class="tab-pane" id="bbb">...Content...</div>
    <div class="tab-pane" id="ccc">...Content...</div>
</div>
</div>   

Fügen Sie jedem li-Element, das nach dem Laden der Seite aktiv sein soll, eine aktive Klasse hinzu. Außerdem muss dem Inhaltsbereich eine aktive Klasse hinzugefügt werden. Das Einblenden von Klassen ist für einen reibungslosen Übergang hilfreich.


Ich brauche je nach Bedingung eine Registerkarte aktiv. Nicht immer wird die erste Registerkarte ausgewählt, wenn die Seite geladen wird
user2607411

Ich denke, dass Sie auch den Inhalt Tauchgang der activeKlasse geben sollten.
MasterAM

@ MasterAM Ja, Sie haben Recht und verblassen auch Klasse, um einen reibungslosen Übergang zu haben. Bearbeitet
codedme

Ich füge die class = "active" zur ersten Registerkarte hinzu, aber der Javascript-Fehler ist nicht verschwunden. Die Registerkarte nimmt den aktiven Stil an, aber der Inhalt wurde nicht
angezeigt

Ich habe den Code bearbeitet. Bitte verwenden Sie diesen. Sie müssen dem content div-Element auch eine aktive Klasse hinzufügen.
Codedme

9

Fügen Sie einem HTML-Tag ein ID-Attribut hinzu

<ul class="nav nav-tabs">
    <li><a href="#aaa" data-toggle="tab" id="tab_aaa">AAA</a></li>
    <li><a href="#bbb" data-toggle="tab" id="tab_bbb">BBB</a></li>
    <li><a href="#ccc" data-toggle="tab" id="tab_ccc">CCC</a></li>
</ul>
<div class="tab-content" id="tabs">
    <div class="tab-pane" id="aaa">...Content...</div>
    <div class="tab-pane" id="bbb">...Content...</div>
    <div class="tab-pane" id="ccc">...Content...</div>
</div>

Dann mit JQuery

$("#tab_aaa").tab('show');

1

Nachdem ich gerade damit gekämpft habe, erkläre ich meine Situation.

Ich habe meine Registerkarten in einem Bootstrap-Modal und stelle beim Laden Folgendes ein (bevor das Modal ausgelöst wird):

$('#subMenu li:first-child a').tab('show');

Während die Registerkarte ausgewählt wurde, war der tatsächliche Bereich nicht sichtbar. Als solches müssen Sie dem Bereich auch activeKlasse hinzufügen :

$('#profile').addClass('active');

In meinem Fall hatte das Fenster #profile(aber das hätte leicht sein können .pane:first-child) das dann das richtige Fenster angezeigt.


0

Warum nicht zuerst die aktive Registerkarte auswählen und dann den Inhalt der ausgewählten Registerkarte aktivieren?
1. Fügen Sie zuerst die Klasse 'active' zum Element <li> der Registerkarte hinzu.
2. Verwenden Sie dann set 'active' class für das ausgewählte div.

    $(document).ready( function(){
        SelectTab(1); //or use other method  to set active class to tab
        ShowInitialTabContent();

    });
    function SelectTab(tabindex)
    {
        $('.nav-tabs li ').removeClass('active');
        $('.nav-tabs li').eq(tabindex).addClass('active'); 
        //tabindex start at 0 
    }
    function FindActiveDiv()
    {  
        var DivName = $('.nav-tabs .active a').attr('href');  
        return DivName;
    }
    function RemoveFocusNonActive()
    {
        $('.nav-tabs  a').not('.active').blur();  
        //to >  remove  :hover :focus;
    }
    function ShowInitialTabContent()
    {
        RemoveFocusNonActive();
        var DivName = FindActiveDiv();
        if (DivName)
        {
            $(DivName).addClass('active'); 
        } 
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.