2015-11-24 4 views
3

Я использую bootstrap radio buttons и хотел бы разрешить отмену радиогруппы. Это можно сделать, используя дополнительную кнопку (Fiddle). Однако вместо дополнительной кнопки я хотел бы отключить выбранный параметр радио, если эта опция нажата, когда она активна.Отменить выбор радиостанции

Я попытался это

$(".btn-group label").on("click", function(e) { 

    var clickedLabel = $(this); 

     if ($(clickedLabel).hasClass("active")) 
     { 
      // an active option was clicked => deselect it 
      $(clickedLabel).children("input:radio").prop("checked", false) 
      $(clickedLabel).removeClass("active"); 
     } 
    } 
) 

, но там, кажется, состояние гонки: событие, нажав на ярлык, который я использую, кажется, используется bootstrap.js установить щелкнул вариант этикетки для «активного ». Если я ввести тайм-аут, класс «активный» удаляется успешно:

$(".btn-group label").on("click", function(e) { 

    var clickedLabel = $(this); 

     if ($(clickedLabel).hasClass("active")) 
     { 
      setTimeout(function() { 
       // an active option was clicked => deselect it 
       $(clickedLabel).children("input:radio").prop("checked", false) 
       $(clickedLabel).removeClass("active"); 
      }, 500) 
     } 
    } 
) 

Как переключить выбранный вариант успешно без использования тайм-аута ?? Спасибо за помощь.

+1

Смотрите http://stackoverflow.com/questions/17120576/how-to-uncheck-checked-radio-button – Chris

+0

Криса, это работает для обычных переключателей, а не для кнопок начальной загрузки (они имеют метку вокруг ввода). – peter

ответ

3

Вместо использования метода двух в preventDefault & stopPropagation, использовать возвращают ложь, будет работать так же.

Разница заключается в том, что return false; немного уступает в тем, что он также предотвращает распространение этого события (или «пузырение вверх») DOM. Вы не можете знать этот бит, когда событие происходит на элементе, это событие запускается на каждом отдельном родительском элементе .

$(".btn-group label").on("click", function(e) { 

    var clickedLabel = $(this); 



      if ($(clickedLabel).hasClass("active")) 
      { 
       // an active option was clicked => deselect it 
       $(clickedLabel).children("input:radio").prop("checked", false) 
       $(clickedLabel).removeClass("active"); 
       return false; 
      } 
     }); 
+0

Это решение намного лучше, чем мое. Использование возврата полностью сошло с ума. – spaniol6

2

После беспорядка с кодом в jsfiddle какое-то время я понял, что комбинация preventDefault() и stopPropagation() делает трюк.

Вот fiddle

и код:

$(".btn-group label").on("click", function(e) { 

    var clickedLabel = $(this); 

     if ($(clickedLabel).hasClass("active")) 
     { 
      // an active option was clicked => deselect it 
      $(clickedLabel).children("input:radio").prop("checked", false) 
      $(clickedLabel).removeClass("active"); 
      e.preventDefault(); 
      e.stopPropagation(); 
     } 
    } 
); 
+0

preventDefault & stopPropagation - отлично, спасибо; o) – peter

+0

@peter Спасибо, рад, что я мог бы помочь! Однако Jhon Carpenter имеет лучшее решение, чем мое, что, я думаю, следует принять вместо этого. – spaniol6

Смежные вопросы