2011-11-10 8 views
13

Muszę dokonywać wzajemnie wykluczających pól wyboru. Natknąłem się na liczne przykłady, które robią to dając przykład jednej grupy checkbox. Jednym z przykładów jest http://blog.schuager.com/2008/09/mutually-exclusive-checkboxes-with.html.Jak utworzyć wzajemnie wykluczającą się grupę pól wyboru?

W moim przypadku mam wiele grup wyboru na tej samej stronie, więc chcę, aby działało jak this example. Kod asp.net będzie example is here, ale chcę to zrobić po stronie klienta kodu.

Jak mogę to zrobić w JavaScript?

Postanowiłem użyć rozszerzającego pole wyboru checkbox ajax. Rozwiązania podane do tej pory opierają się w zasadzie na przyciskach radiowych. Ten link naprawdę mi pomógł .. http://www.asp.net/ajax/videos/how-do-i-use-the-aspnet-ajax-mutuallyexclusive-checkbox-extender

+7

Czy istnieje szczególny powód, dla którego nie chcesz używać do tego elementów radiowych? –

+0

wzajemnie wykluczające pola wyboru ----> Radiobuttons! – Bazzz

+0

aka Radiobuttons – John

Odpowiedz

12

Korzystanie Mutual wyboru, gdy przycisk Radio jest to zły pomysł, ale nadal można to zrobić w następujący sposób

HTML

<div>  
    Red: <input id="chkRed" name="chkRed" type="checkbox" value="red" class="checkbox"> 
    Blue: <input id="chkBlue" name="chkBlue" type="checkbox" value="blue" class="checkbox"> 
    Green: <input id="chkGreen" name="chkGreen" type="checkbox" value="green" class="checkbox"> 
</div> 

<div> 
    Mango: <input id="chkRed" name="chkMango" type="checkbox" value="Mango" class="checkbox"> 
    Orange: <input id="chkBlue" name="chkOrange" type="checkbox" value="Orange" class="checkbox"> 
    Banana: <input id="chkGreen" name="chkBanana" type="checkbox" value="Banana" class="checkbox"> 
</div> 

Jquery

$('div .checkbox').click(function() { 
       checkedState = $(this).attr('checked'); 
        $(this).parent('div').children('.checkbox:checked').each(function() { 
         $(this).attr('checked', false); 
        }); 
        $(this).attr('checked', checkedState); 
}); 

A oto fiddle

+5

Zobacz moją zaktualizowaną wersję (http://jsfiddle.net/3TssG/) – OnesimusUnbound

+0

@OnesimusUnbound Great. Twój kod jest prostszy. –

+0

i użycie polecenia div input order jest również dobre. – OnesimusUnbound

9

Tak jak powiedziałem w swoim komentarzu, powinieneś naprawdę użyć elementów <radio>. Daj im tę samą nazwę i działają niemal w ten sam sposób:

<label><input type="radio" name="option" value="Option 1">Option 1</label> 
<label><input type="radio" name="option" value="Option 2">Option 2</label> 

Jedyną istotną różnicą jest to, że po wybraniu jednego z nich, co najmniej jeden z nich musi być włączony (czyli nie możesz odznacz je ponownie).

Jeśli naprawdę chcesz zrobić to z polami wyboru, przypomnij sobie, że użytkownicy z wyłączoną obsługą JavaScript będą mogli wybrać wszystkie opcje, jeśli im się podoba. Jeśli nadal będziesz potrzebować tego, aby ,, musisz nadać każdej grupie pól wyboru unikalną nazwę klasy. Następnie zajmij się zdarzeniem zmiany każdego elementu pola wyboru i usuń zaznaczenie wszystkich pozostałych elementów pasujących do tej samej nazwy klasy, co kliknięty element.

+2

+1. Może również zmodyfikować ich wygląd w JS, tak aby wyglądały jak pola wyboru, jeśli naprawdę tego potrzebuje (choć nie jestem pewien, czy to dobry pomysł), zob. http://stackoverflow.com/questions/279421/can-you-style-an-html-radio-button-to-look-like-a-checkbox. Jeśli chodzi o zachowanie odznaczania, rozwiązaniem może być zapewnienie przycisku z domyślną (pustą?) Wartością. – Shautieh

+0

@Shautieh: tak, myślałem o poleceniu stylizacji elementów radiowych, ale trudno jest to osiągnąć w sposób umożliwiający przeglądanie w różnych przeglądarkach. –

+0

Jednym z możliwych scenariuszy nieprzydatnych dla radiobutonów jest odznaczenie ich – Daniel

2

Mam nadzieję, że this będzie działać

HTML

A <input type="checkbox" class="alpha" value="A" /> | 
B <input type="checkbox" class="alpha" value="B" /> | 
C <input type="checkbox" class="alpha" value="C" /> 
<br /> 

1 <input type="checkbox" class="num" value="1" /> | 
2 <input type="checkbox" class="num" value="2" /> | 
3 <input type="checkbox" class="num" value="3" /> 

JavaScript

// include jQuery library 
var enforeMutualExcludedCheckBox = function(group){ 
    return function() { 
     var isChecked= $(this).prop("checked"); 
     $(group).prop("checked", false); 
     $(this).prop("checked", isChecked); 
    } 
}; 

$(".alpha").click(enforeMutualExcludedCheckBox(".alpha")); 
$(".num").click(enforeMutualExcludedCheckBox(".num")); 

dobrze, przycisk radiowy powinien być jeden do wykorzystania we wzajemnie wyłączonych opcji, choć nie spotkałem scenariusz, w którym klient wolał mieć od zera do jednego wybranego elementu, a pole wyboru javaScript'ed działa dobrze.

Aktualizacja

Patrząc na moją odpowiedź, zdałem sobie sprawę, że to zbędne, aby odnieść się do klasy css dwukrotnie.Po zaktualizowaniu mojego kodu w celu przekształcenia go w jQuery plugin i stworzył dwa rozwiązania, w zależności od uprzywilejowane

Uzyskaj wszystkie pola, których kontrola jest wzajemnie wykluczone

$.fn.mutuallyExcludedCheckBoxes = function(){ 
    var $checkboxes = this; // refers to selected checkboxes 

    $checkboxes.click(function() { 
     var $this = $(this), 
      isChecked = $this.prop("checked"); 

     $checkboxes.prop("checked", false); 
     $this.prop("checked", isChecked); 
    }); 
}; 

// more elegant, just invoke the plugin 
$("[name=alpha]").mutuallyExcludedCheckBoxes(); 
$("[name=num]").mutuallyExcludedCheckBoxes(); 

HTML

A <input type="checkbox" name="alpha" value="A" /> | 
B <input type="checkbox" name="alpha" value="B" /> | 
C <input type="checkbox" name="alpha" value="C" /> 
<br /> 

1 <input type="checkbox" name="num" value="1" /> | 
2 <input type="checkbox" name="num" value="2" /> | 
3 <input type="checkbox" name="num" value="3" /> 

sample code

Grupa wszystkich wykluczonych kontroli wzajemnie Skrzynki w elemencie zawierającym

JavaScript

$.fn.mutuallyExcludedCheckBoxes = function(){ 
    var $checkboxes = this.find("input[type=checkbox]"); 

    $checkboxes.click(function() { 
     var $this = $(this), 
      isChecked = $this.prop("checked"); 

     $checkboxes.prop("checked", false); 
     $this.prop("checked", isChecked); 
    }); 
}; 

// select the containing element, then trigger the plugin 
// to set all checkboxes in the containing element mutually 
// excluded 
$(".alpha").mutuallyExcludedCheckBoxes(); 
$(".num").mutuallyExcludedCheckBoxes(); 

HTML

<div class="alpha"> 
A <input type="checkbox" value="A" /> | 
B <input type="checkbox" value="B" /> | 
C <input type="checkbox" value="C" /> 
</div> 

<div class="num"> 
1 <input type="checkbox" value="1" /> | 
2 <input type="checkbox" value="2" /> | 
3 <input type="checkbox" value="3" /> 
</div> 

sample code

Enjoy :-)

1

myślę, że to jest to, co chcesz.

Rozważmy HTML poniżej:

<form action=""> 
    My favourite colors are:<br /> 
    <br /> 
    <input type="checkbox" value="red" name="color" /> Red<br /> 
    <input type="checkbox" value="yellow" name="color" /> Yellow<br /> 
    <input type="checkbox" value="blue" name="color" /> Blue<br /> 
    <input type="checkbox" value="orange" name="color1" /> Orange<br /> 
    <input type="checkbox" value="green" name="color1" /> Green<br /> 
    <input type="checkbox" value="purple" name="color1" /> Purple 
</form> 

pamiętać, że nie ma dwóch nazw dla grup kolorystycznych: red, yellow, blue i orage, green, purple

I JavaScript opisanych poniżej będą pracować ogólnie do wszystkich checkbox na stronie.

jQuery("input[type=checkbox]").unbind("click"); 
jQuery("input[type=checkbox]").each(function(index, value) { 
    var checkbox = jQuery(value); 
    checkbox.bind("click", function() { 
     var check = checkbox.attr("checked"); 
     jQuery("input[name=" + checkbox.attr('name') + "]").prop("checked", false); 
     checkbox.attr("checked", check); 
    }); 
}); 

Spójrz na tego LIVE example

5

Spróbuj tego:

HTML

<div> 
    Car: <input id="chkVehicleCar" name="chkVehicle" type="checkbox" value="Car" class="radiocheckbox"> 
    Moto: <input id="chkVehicleMoto" name="chkVehicle" type="checkbox" value="Moto" class="radiocheckbox"> 
    Byke: <input id="chkVehicleByke" name="chkVehicle" type="checkbox" value="Byke" class="radiocheckbox"> 
    Feet: <input id="chkVehicleFeet" name="chkVehicle" type="checkbox" value="Feet"> 
</div> 

<span>  
    Red: <input id="chkColorRed" name="chkColor" type="checkbox" value="Red" class="radiocheckbox"> 
    Blue: <input id="chkColorBlue" name="chkColor" type="checkbox" value="Blue" class="radiocheckbox"> 
    Green: <input id="chkColorGreen" name="chkColor" type="checkbox" value="Green" class="radiocheckbox"> 

    Mango: <input id="chkFruitMango" name="chkFruit" type="checkbox" value="Mango" class="radiocheckbox"> 
    Orange: <input id="chkFruitOrange" name="chkFruit" type="checkbox" value="Orange" class="radiocheckbox"> 
    Banana: <input id="chkFruitBanana" name="chkFruit" type="checkbox" value="Banana" class="radiocheckbox"> 
</span> 

JavaScript/jQuery

$(':checkbox.radiocheckbox').click(function() { 
    this.checked 
     && $(this).siblings('input[name="' + this.name + '"]:checked.' + this.className) 
        .prop('checked', false); 
});​ 

wzajemnie się wykluczają wyboru są pogrupowane według kontenera + nazwa + nazwa klasy. Możesz używać różnych grup w tym samym pojemniku, a także mieszać wyjątkowe i niewyłączne pole wyboru o tej samej nazwie. Kod JavaScript jest wysoce zoptymalizowany. Możesz zobaczyć working example.

1

Bez względu na to, gdzie znajduje się pole wyboru na Twojej stronie, wystarczy określić grupę i gotowe!

<input type='checkbox' data-group='orderState'> pending 
    <input type='checkbox' data-group='orderState'> solved 
    <input type='checkbox' data-group='orderState'> timed out 

    <input type='checkbox' data-group='sex'> male 
    <input type='checkbox' data-group='sex'> female 

    <input type='checkbox'> Isolated 


    <script> 
     $(document).ready(function() { 
      $('input[type=checkbox]').click(function() { 
      var state = $(this)[0].checked, 
       g = $(this).data('group'); 
      $(this).siblings() 
      .each(function() { 
    $(this)[0].checked = g==$(this).data('group')&&state ? false : $(this)[0].checked; 
      }); 
    }); 
})</script> 
Powiązane problemy