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?

user2607411
quelle
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.)

MasterAM
quelle
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();
Kamran Ahmed
quelle
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
20

Dieser ist von w3schools ganz einfach: https://www.w3schools.com/bootstrap/bootstrap_ref_js_tab.asp

// Select tab by name
$('.nav-tabs a[href="#home"]').tab('show')

// Select first tab
$('.nav-tabs a:first').tab('show') 

// Select last tab
$('.nav-tabs a:last').tab('show') 

// Select fourth tab (zero-based)
$('.nav-tabs li:eq(3) a').tab('show')
Amine Boulaajaj
quelle
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.

codedme
quelle
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');
Dmytro Goncharuk
quelle
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.

Antonius
quelle
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'); 
        } 
    }
Kanit P.
quelle