Können Sie Registerkarten in Bootstrap deaktivieren?

Antworten:

188

Sie können das data-toggle="tab"Attribut von der Registerkarte entfernen, wenn es über Live- / Delegate-Ereignisse verbunden ist

Betty
quelle
11
Dank arbeitete ein Vergnügen, fügte auch CSS "Cursor: No-Drop;" für Cursor also verwenden weiß, warum sie nicht darauf klicken können
Arbme
23
Cursor: nicht erlaubt; ist in diesem Fall angemessener. Es sei denn, Sie ziehen und ziehen tatsächlich.
Christophe Geers
9
Oder fügen Sie eine deaktivierte Klasse zum li
Pencilcheck
6
Sie müssen beide Vorschläge oben verwenden: Fügen Sie "deaktivierte" Klasse zu <li> hinzu UND entfernen Sie das Daten-Google- oder href-Attribut von der Registerkarte
Scabbia
9
Ich habe dieses CSS einfach hinzugefügt und class="disabled"funktioniert jetzt wie erwartet.nav.nav-tabs > li.disabled { pointer-events: none; a { color: silver; } }
effe
49

Ab 2.1 können Sie aus der Bootstrap-Dokumentation unter http://twitter.github.com/bootstrap/components.html#navs .

Deaktivierter Status

Fügen Sie für jede Navigationskomponente (Registerkarten, Pillen oder Listen) .disabled für graue Links und keine Hover-Effekte hinzu. Links bleiben jedoch anklickbar, es sei denn, Sie entfernen das href-Attribut. Alternativ können Sie benutzerdefiniertes JavaScript implementieren, um diese Klicks zu verhindern.

Weitere Informationen zum Hinzufügen von Funktionen finden Sie unter https://github.com/twitter/bootstrap/issues/2764 .

Scott Stafford
quelle
1
Dies ist eine der Hauptfunktionen und es verwirrt mich, dass es noch nicht implementiert ist
DS_web_developer
Es ist in v3
Jeroen K
8
Ja, aber Links können weiterhin angeklickt werden.
Svlada
3
Genau genommen besteht die praktikable Lösung bisher darin, das Datenumschaltattribut zu entfernen.
Cyril N.
34

Ich habe das folgende Javascript hinzugefügt, um Klicks auf deaktivierte Links zu verhindern:

$(".nav-tabs a[data-toggle=tab]").on("click", function(e) {
  if ($(this).hasClass("disabled")) {
    e.preventDefault();
    return false;
  }
});
Totas
quelle
9
Ich denke, eine Kombination aus dieser und der Antwort von @ hotzu sollte die Antwort sein. Sie sollten die disabledKlasse zum liElement hinzufügen und dann das von Ihnen angegebene Javascript hinzufügen, mit Ausnahme der Bedingung, gegen die Sie prüfen würden : if ($(this).parent().hasClass('disabled')) {..}.
im1dermike
@ im1dermike Ich verstehe nicht, warum ich das tun würde?
Totas
Alte Frage, aber es ist das, was ich gefunden habe, also füge ich dies hinzu. Sie würden diese Überprüfung durchführen, da dies die liGrafik für den Benutzer ändert und folglich die disabledKlasse haben sollte.
Jared
23

Ich denke, die beste Lösung ist das Deaktivieren mit CSS. Sie definieren eine neue Klasse und deaktivieren die Mausereignisse darauf:

.disabledTab{
    pointer-events: none;
}

Und dann ordnen Sie diese Klasse dem gewünschten li-Element zu:

<li class="disabled disabledTab"><a href="#"> .... </a></li>

Sie können die Klasse auch mit jQuery hinzufügen / entfernen. So deaktivieren Sie beispielsweise alle Registerkarten:

$("ul.nav li").removeClass('active').addClass('disabledTab');

Hier ist ein Beispiel: jsFiddle

Zsolt Tolvaly
quelle
Danke @hotzu du hast mir den Tag leicht gemacht .. :)
Gaurav Singh
Ich würde es wärmstens empfehlen. da eine CSS-Lösung die Registerkarten anklickbar lässt. Falls andere Ereignisse auf diese Klicks warten, werden sie ausgeführt, was nicht das gewünschte Ergebnis ist. (Ich denke?)
Dementic
In meinem Fall hat dies den Trick getan. Ich habe ein Formular erstellt, das aus mehreren Registerkarten besteht. Das Wechseln zur nächsten Registerkarte erfolgt über eine Schaltfläche, die ein Klickereignis auf der Registerkarte auslöst, zu der Sie wechseln möchten. Das vollständige Deaktivieren von Klicks ist für mich keine Option, aber das Entfernen von Zeigerereignissen von den Registerkarten war genau das, was ich brauchte.
Sebastian
17

Keine Notwendigkeit, nur einzeiliges CSS

.nav-tabs li.disabled a {
    pointer-events: none;
}
Rubel Hossain
quelle
1
Ich musste dies auf li.disabled (nicht li.disabled a) tun
Daniel
10

Außerdem verwende ich folgende Lösung:

$('a[data-toggle="tab"]').on('click', function(){
  if ($(this).parent('li').hasClass('disabled')) {
    return false;
  };
});

Jetzt fügt das Hinzufügen der Klasse 'disabled' zum übergeordneten li und tab nicht mehr hinzu und wird grau.

Akopichin
quelle
6

Alte Frage, aber sie hat mich irgendwie in die richtige Richtung gelenkt. Die Methode, für die ich mich entschieden habe, bestand darin, die deaktivierte Klasse zum li hinzuzufügen und dann den folgenden Code zu meiner Javascript-Datei hinzuzufügen.

$('.nav-tabs li.disabled > a[data-toggle=tab]').on('click', function(e) {
    e.stopImmediatePropagation();
});

Dadurch wird jeder Link deaktiviert, bei dem die Klasse li deaktiviert ist. Ähnlich wie die Antwort von totas, aber es wird nicht ausgeführt, wenn ein Benutzer jedes Mal auf einen Tab-Link klickt und return false nicht verwendet.

Hoffentlich wird es jemandem nützlich sein!

James
quelle
1
gut! aber brauche e.preventDefault () vor e.stopImmediatePropagation ()
meuwka
6

Für mich war die beste Lösung eine Mischung aus einigen der Antworten hier:

  • Hinzufügen der disabledKlasse zu dem Li, das ich deaktivieren möchte
  • Fügen Sie dieses Stück JS hinzu:

       `$(".nav .disabled>a").on("click", function(e) {
            e.preventDefault();
            return false;
        });`
  • Sie können sogar das Attribut data-toggle = "tab" entfernen, wenn Bootstrap Ihren Code überhaupt nicht stören soll.

**** HINWEIS **: ** Der JS-Code hier ist wichtig, auch wenn Sie die Datenumschaltung entfernen, da sonst Ihre URL durch Hinzufügen des #your-idWerts aktualisiert wird. Dies wird nicht empfohlen, da Ihre Registerkarte deaktiviert ist. daher sollte nicht zugegriffen werden.

Cyril N.
quelle
4

Mit nur CSS können Sie zwei CSS-Klassen definieren.

<style type="text/css">
    /* Over the pointer-events:none, set the cursor to not-allowed.
    On this way you will have a more user friendly cursor. */
    .disabledTab {
        cursor: not-allowed;
    }
    /* Clicks are not permitted and change the opacity. */
    li.disabledTab > a[data-toggle="tab"] {
        pointer-events: none;
        filter: alpha(opacity=65);
        -webkit-box-shadow: none;
        box-shadow: none;
        opacity: .65;
    }
</style>

Dies ist eine HTML-Vorlage. Sie müssen lediglich die Klasse auf Ihr bevorzugtes Listenelement festlegen.

<ul class="nav nav-tabs tab-header">
    <li>
        <a href="#tab-info" data-toggle="tab">Info</a>
    </li>
    <li class="disabledTab">
        <a href="#tab-date" data-toggle="tab">Date</a>
    </li>
    <li>
        <a href="#tab-photo" data-toggle="tab">Photo</a>
    </li>
</ul>
<div class="tab-content">
    <div class="tab-pane active" id="tab-info">Info</div>
    <div class="tab-pane active" id="tab-date">Date</div>
    <div class="tab-pane active" id="tab-photo">Photo</div>
</div>
George Siggouroglou
quelle
2

Angenommen, dies ist Ihr TAB und Sie möchten es deaktivieren

<li class="" id="groups"><a data-toggle="tab" class="navuserli" href="#groups" aria-expanded="false">Groups</a></li>

Sie können diese Registerkarte also auch deaktivieren, indem Sie dynamisches CSS hinzufügen

$('#groups').css('pointer-events', 'none')
Vinaysingh Khetwal
quelle
1

Zusätzlich zu James 'Antwort:

Wenn Sie den Link deaktivieren müssen, verwenden Sie

$('a[data-toggle="tab"]').addClass('disabled');

Wenn Sie verhindern möchten, dass ein deaktivierter Link die Registerkarte lädt

$('a[data-toggle="tab"]').click(function(e){

            if($this.hasClass("disabled")){

                e.preventDefault();

                e.stopPropagation();

                e.stopImmediatePropagation();

                return false;

            }
}

Wenn Sie den Link nicht aktivieren können

$('a[data-toggle="tab"]').removeClass('disabled');
RafaSashi
quelle
0

Ich habe alle vorgeschlagenen Antworten ausprobiert, aber schließlich habe ich es so gemacht

if (false) //your condition
{
    $("a[data-toggle='tab'").prop('disabled', true);
    $("a[data-toggle='tab'").each(function () {
        $(this).prop('data-href', $(this).attr('href')); // hold you original href
        $(this).attr('href', '#'); // clear href
    });                
    $("a[data-toggle='tab'").addClass('disabled-link');
}
else
{
    $("a[data-toggle='tab'").prop('disabled', false);
    $("a[data-toggle='tab'").each(function () {
        $(this).attr('href', $(this).prop('data-href')); // restore original href
    });
    $("a[data-toggle='tab'").removeClass('disabled-link');
}
// if you want to show extra messages that the tab is disabled for a reason
$("a[data-toggle='tab'").click(function(){
   alert('Tab is disabled for a reason');
});
Abou-Emish
quelle
0

Keine der Antworten funktioniert für mich. Entfernen data-toggle="tab"von averhindert, dass die Registerkarte aktiviert wird, fügt aber auch den #tabIdHash zur URL hinzu. Das ist für mich inakzeptabel. Was auch nicht akzeptabel ist, ist die Verwendung von Javascript.

Was funktioniert, ist das Hinzufügen der disabledKlasse zum liund Entfernen des hrefAttributs des enthaltenen a.

im1dermike
quelle
Jetzt, wo ich weiter unten lese, ist dies im Grunde die gleiche genaue Antwort wie die von @Scott Stafford, der sie 2 Jahre zuvor beantwortet hat ...
Jim
0

Meine Registerkarten befanden sich in Bedienfeldern, daher habe ich dem Registerkartenanker eine Klasse = 'deaktiviert' hinzugefügt

in javascript habe ich hinzugefügt:

$(selector + ' a[data-toggle="tab"]').on('show.bs.tab', function (e) {
    if ($(this).hasClass('disabled')){
        e.preventDefault();
        return false;
    }
})

und für die Präsentation in weniger habe ich hinzugefügt:

.panel-heading{
    display:table;
    width:100%;
    padding-bottom:10px;
    ul.nav-tabs{
        display:table-cell;
        vertical-align:bottom;
        a.disabled{
            .text-muted;
            cursor:default;
            &:hover{
                background-color:transparent;
                border:none;
            }
        }
    }
}
pgee70
quelle
0

Die einfachste und sauberste Lösung, um dies zu vermeiden, ist das Hinzufügen onclick="return false;"zum aTag.

<ul class="nav nav-tabs">
    <li class="active">
        <a href="#home" onclick="return false;">Home</a>
    </li>    
    <li>
        <a href="#ApprovalDetails" onclick="return false;">Approval Details</a>
    </li>
</ul>
  • Das Hinzufügen "cursor:no-drop;"lässt den Cursor nur deaktiviert aussehen, ist aber anklickbar . Die URL wird zum Beispiel mit dem href-Ziel angehängtpage.apsx#Home
  • Das Hinzufügen und Entfernen von "disabled"Klassen zu <li>AND ist nicht erforderlichhref
Gaurravs
quelle
0

Sie können eine Registerkarte in Bootstrap 4 deaktivieren, indem Sie disableddem untergeordneten Element von nav-item wie folgt eine Klasse hinzufügen

<li class="nav-item">
    <a class="nav-link disabled" data-toggle="tab" href="#messages7" role="tab" aria-expanded="false">
        <i class="icofont icofont-ui-message"></i>Home</a>
    <div class="slide"></div>
</li>
NIKHIL NEDIYODATH
quelle
-1

Hier ist mein Versuch. So deaktivieren Sie eine Registerkarte:

  1. Fügen Sie der LI des Tabs die Klasse "disabled" hinzu.
  2. Entfernen Sie das Attribut 'data-toggle' aus LI> A;
  3. Unterdrücken Sie das Klickereignis auf LI> A.

Code:

var toggleTabs = function(state) {
    disabledTabs = ['#tab2', '#tab3'];
    $.each(disabledTabs, $.proxy(function(idx, tabSelector) {
        tab = $(tabSelector);
        if (tab.length) {
            if (state) {
                // Enable tab click.
                $(tab).toggleClass('disabled', false);
                $('a', tab).attr('data-toggle', 'tab').off('click');
            } else {
                // Disable tab click.
                $(tab).toggleClass('disabled', true);
                $('a', tab).removeAttr('data-toggle').on('click', function(e){
                    e.preventDefault();
                });
            }
        }
    }, this));
};

toggleTabs.call(myTabContainer, true);
Temuri
quelle