2015-03-29 27 views
8

Jak mogę wyłączyć przyciski opcji Bootstrap 3? Jeśli zacznę z BS3 example i dodać disabled="disabled" do każdego elementu wejściowego, nie ma żadnych zmian w wyglądzie lub zachowaniu:Dezaktywować przycisk radiowy w bootstrap 3?

<div class="container"> 
<div class="btn-group" data-toggle="buttons"> 
    <label class="btn btn-primary active"> 
     <input type="radio" name="options" id="option1" autocomplete="off" checked disabled="disabled">Radio 1 (preselected)</label> 
    <label class="btn btn-primary"> 
     <input type="radio" name="options" id="option2" autocomplete="off" disabled="disabled">Radio 2</label> 
    <label class="btn btn-primary"> 
     <input type="radio" name="options" id="option3" autocomplete="off" disabled="disabled">Radio 3</label> 
</div> 

Demo: JSFiddle.

Domyślam się, że jest to spowodowane tym, że wyłączony atrybut jest stosowany tylko do przycisku niewidocznego teraz, a nie klikalnej etykiety tekstowej, ale nie widzę niczego w dokumentach BS3 na ten temat.

+0

trzeba dodać klasę wyłączone do tych osób! –

Odpowiedz

15

Dodaj disabled klasę na etykiecie jak ten

<div class="btn-group" data-toggle="buttons"> 
    <label class="btn btn-primary disabled"> 
    <input type="checkbox" autocomplete="off"> Checkbox 1 (pre-checked) 
    </label> 
    <label class="btn btn-primary active disabled"> 
    <input type="checkbox" autocomplete="off"> Checkbox 2 
    </label> 
    <label class="btn btn-primary disabled"> 
    <input type="checkbox" autocomplete="off"> Checkbox 3 
    </label> 
</div> 

Oto demo

+2

To znacznie lepiej! Czy istnieje sposób wskazania, który stan jest sprawdzany, gdy przyciski są wyłączone? Wygląda na to, że aktywny atrybut i zaznaczony atrybut są ignorowane. –

+1

Tak, bootstrap nie obsługuje obu jednocześnie. Prawdopodobnie będziesz musiał napisać styl niestandardowy dla tego – Dhiraj

+4

, to rozwiązanie nie działa w wersjach 3.3.4 do 3.3.6 powinno zostać naprawione w 3.3.7. https://github.com/twbs/bootstrap/issues/16703 input wydaje się wyłączony, ale reaguje na kliknięcie. Straciłem pół godziny, żeby to zrozumieć ... – giammin

5

Jak wspomniano przez @giammin w komentarzach do przyjętej odpowiedź, ustawienie „wyłączone” na elementach wejściowych robi” t działa w 3.3.6 bootstrap. (Aktualna wersja w momencie publikacji tej odpowiedzi).

miałem dokładnie ten sam problem, a moje rozwiązanie było użyć właściwości CSS „wskaźnika zdarzeń”. Dzięki temu element i dzieci nigdy nie są celem zdarzeń kliknięcia. Nie jest to jednak niezawodne rozwiązanie - użytkownicy mogą nadal używać tabulatora i używać spacji do klikania ukrytych elementów w przeglądarce na komputerze.

.disabled-group 
{ 
    pointer-events: none; 
} 

Jeśli ustawisz na '.btn grupa' elementu, będziesz całkowicie wyłączyć

<div class="btn-group disabled-group" data-toggle="buttons"> 
    <label class="btn btn-primary disabled"> 
     <input type="checkbox" autocomplete="off"> Checkbox 1 (pre-checked) 
    </label> 
    <label class="btn btn-primary disabled"> 
     <input type="checkbox" autocomplete="off"> Checkbox 2 
    </label> 
    <label class="btn btn-primary disabled"> 
    <input type="checkbox" autocomplete="off"> Checkbox 3 
    </label> 
</div> 

do '.disabled' klasa jest wtedy opcja - wykorzystanie go do wyszarzanie i "kursor: niedozwolony;" własność.

Dyskusja rozwiązania fix jest w tym źródle: https://github.com/twbs/bootstrap/issues/16703

+0

Nie sądzę, że możliwe jest użycie 'pointer-events: none' i zezwolenie na wyświetlanie niedozwolonego kursora po najechaniu myszą. Przynajmniej nie mogłem tego zrobić bez magii JS. –

+1

@self. - masz rację, nie jest. To kompromis między jednym a drugim. Ale stwierdziłem, że wskaźniki są bardziej wiarygodne. Oczywiście zwrócono również uwagę, że twój użytkownik może również przejść do opcji niepełnosprawnych. – ortonomy

+1

to jest poprawna odpowiedź !!!! zapisz mi dzień, dzięki! – Amos

4

Dla grup przycisków radiowych, dodać klasę wyłączone do jednego chcesz wyłączone. Upewnij się, że coś takiego kodu:

$('.btn-group').on("click", ".disabled", function(event) { 
    event.preventDefault(); 
    return false; 
}); 

To będzie uzyskać wszystkie .disabled sklasyfikowane przyciski wewnątrz grupy przycisków wyłączony także. Działa to również w przypadku grup przycisków typu radia.

0

W bootstrapie, jeśli chcesz wyłączyć dowolny typ wejścia lub przycisk, musisz tylko dodać klasę bootstrap .disabled, a następnie przycisk zostanie wyłączony.

Jak to

<input type="radio" class="btn btn-primary disabled">Primary Button</button> 
0

Można użyć powyższego wyłączyć wejście [type = 'radio'], który jest wewnątrz etykiety (Bootstrap 3 style),

$("input[name='INPUT_RADIO_NAME']").prop("disabled", true); 
$("input[name='INPUT_RADIO_NAME']").closest("div").css("pointer-events", "none"); 

powyżej, aby ponownie włączyć,

$("input[name='INPUT_RADIO_NAME']").prop("disabled", false); 
$("input[name='INPUT_RADIO_NAME']").closest("div").css("pointer-events", "auto"); 

Można również rozszerzyć JQuery i utworzyć fałszywą di Metoda sable (które można uaktualnić z większą funkcjonalnością) tak,

(function ($) { 
    $.fn.disableMe = function() { 
     // Validate. 
     if ($.type(this) === "undefined") 
      return false; 

     // Disable only input elements. 
     if ($(this).is("input") || $(this).is("textarea")) { 
      // In case it is a radio inside a label. 
      if ($(this).is("[type='radio']") && $(this).parent().is("label.btn")) { 
       $("input[name='safeHtml']").closest("label").addClass("disabled"); 
       $(this).closest("div").css("pointer-events", "none"); 
      } 

      // General input disable. 
      $(this).prop("disabled", true); 
     } 
    }; 
    $.fn.enableMe = function() { 
     // Validate. 
     if ($.type(this) === "undefined") 
      return false; 

     // Enable only input elements. 
     if ($(this).is("input") || $(this).is("textarea")) { 
      // In case it is a radio inside a label. 
      if ($(this).is("[type='radio']") && $(this).parent().is("label.btn")) { 
       $("input[name='safeHtml']").closest("label").removeClass("disabled"); 
       $(this).closest("div").css("pointer-events", "auto"); 
      } 

      // General input enable. 
      $(this).prop("disabled", false); 
     } 
    }; 
    $.fn.toggleDisable = function() { 
     if ($.type(this) === "undefined") 
      return false; 

     // Toggle only input elements. 
     if ($(this).is("input") || $(this).is("textarea")) { 
      var isDisabled = $(this).is(":disabled"); 

      // In case it is a radio inside a label. 
      if ($(this).is("[type='radio']") && $(this).parent().is("label.btn")) { 
       $("input[name='safeHtml']").closest("label").toggleClass("disabled"); 
       $(this).closest("div").css("pointer-events", isDisabled ? "auto" : "none"); 
      } 

      // General input enale. 
      $(this).prop("disabled", !isDisabled); 
     } 
    }; 
}(jQuery)); 

Przykład użycia,

$("input[name='INPUT_RADIO_NAME']").disableMe(); 
$("input[name='INPUT_RADIO_NAME']").enableMe(); 
$("input[name='INPUT_RADIO_NAME']").toggleDisable(); 
Powiązane problemy