2011-11-10 52 views
13

Tôi phải tạo các hộp kiểm loại trừ lẫn nhau. Tôi đã đi qua rất nhiều ví dụ làm điều đó cho ví dụ về một nhóm hộp kiểm. Một ví dụ ở số http://blog.schuager.com/2008/09/mutually-exclusive-checkboxes-with.html.Làm cách nào để tôi có thể tạo một nhóm hộp kiểm loại trừ lẫn nhau?

Trong trường hợp của tôi, tôi có nhiều nhóm hộp kiểm trên cùng một trang, vì vậy tôi muốn nó hoạt động như this example. Một codebehind asp.net example is here, nhưng tôi muốn làm điều đó trong mã phía máy khách.

Tôi làm cách nào để thực hiện điều này trong JavaScript?

tôi đã quyết định sử dụng trình mở rộng hộp kiểm độc quyền ajax lẫn nhau. Các giải pháp cho đến nay về cơ bản dựa trên các nút radio. Liên kết này thực sự đã giúp tôi .. http://www.asp.net/ajax/videos/how-do-i-use-the-aspnet-ajax-mutuallyexclusive-checkbox-extender

+7

Có lý do cụ thể nào bạn không muốn sử dụng các phần tử radio cho điều này không? –

+0

các hộp kiểm cùng loại exe ------ Radiobuttons! – Bazzz

+0

aka Radiobuttons – John

Trả lời

12

Sử dụng Hộp kiểm Mutual khi có nút Radio là một ý tưởng tồi nhưng bạn vẫn có thể làm điều này như sau

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); 
}); 

Và đây là fiddle

+5

Xem [phiên bản] cập nhật của tôi (http://jsfiddle.net/3TssG/) – OnesimusUnbound

+0

@OnesimusUnbound Great. Mã của bạn đơn giản hơn nhiều. –

+0

và sử dụng thứ tự đầu vào div cũng tốt. – OnesimusUnbound

9

Như tôi đã nói trong nhận xét của mình, bạn thực sự nên sử dụng các phần tử <radio> cho việc này. Cung cấp cho họ cùng tên và họ làm việc gần như cùng một cách:

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

Sự khác biệt có ý nghĩa duy nhất là, một khi một trong số họ được chọn, ít nhất một trong số họ đã được trên (ví dụ, bạn có thể không bỏ chọn chúng một lần nữa).

Nếu bạn thực sự cảm thấy cần phải làm điều đó với hộp kiểm, hãy nhắc nhở chính mình rằng người dùng đã tắt JavaScript sẽ có thể chọn tất cả các tùy chọn nếu họ muốn. Nếu bạn vẫn còn cảm thấy cần phải làm điều đó, thì bạn sẽ cần phải cung cấp cho mỗi nhóm hộp kiểm một tên lớp duy nhất. Sau đó, xử lý sự kiện thay đổi của từng phần tử hộp kiểm và bỏ chọn tất cả các phần tử khác khớp với tên lớp giống như phần tử được nhấp.

+2

+1. Anh ta cũng có thể sửa đổi cái nhìn của họ trong JS để họ trông giống như các hộp kiểm tra nếu anh ta thực sự cần (mặc dù tôi không chắc đó là một ý tưởng hay), cf. http://stackoverflow.com/questions/279421/can-you-style-an-html-radio-button-to-look-like-a-checkbox. Đối với hành vi bỏ chọn, giải pháp thay thế có thể là cung cấp nút radio có giá trị mặc định (trống?). – Shautieh

+0

@Shautieh: vâng, tôi cũng đang suy nghĩ về việc giới thiệu các yếu tố tạo kiểu dáng, nhưng rất khó để đạt được theo cách thức trình duyệt chéo. –

+0

Một kịch bản có thể xảy ra đối với các nút vô tuyến không hữu ích là khi bạn cần bỏ chọn chúng – Daniel

2

Tôi hy vọng this một người sẽ làm việc

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")); 

tốt, nút radio nên là một được sử dụng trong các tùy chọn loại trừ lẫn nhau, mặc dù tôi đã gặp phải một kịch bản mà khách hàng ưa thích có số không cho một mục đã chọn và hộp kiểm javaScript'ed hoạt động tốt.

Cập nhật

Nhìn vào câu trả lời của tôi, tôi nhận ra đó là không cần thiết để tham khảo các lớp css hai lần.Tôi cập nhật mã của tôi để chuyển đổi nó thành một plugin jquery, và tạo ra hai giải pháp, tùy thuộc vào những sở thích

Nhận tất cả các hộp kiểm có kiểm tra được loại trừ lẫn nhau

$.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

Nhóm tất cả các kiểm tra loại trừ lẫn nhau hộp trong một phần tử chứa

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

Thưởng thức :-)

1

Tôi đoán đây là những gì bạn muốn.

Xem xét HTML dưới đây:

<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> 

Lưu ý rằng có hai tên cho các nhóm màu: red, yellow, blueorage, green, purple

Và JavaScript này lưu ý dưới đây sẽ làm việc tổng quát cho tất cả các checkbox trên trang.

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); 
    }); 
}); 

Hãy xem này LIVE example

5

Hãy thử điều này:

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); 
});​ 

hộp kiểm loại trừ lẫn nhau được nhóm theo vùng chứa + tên + tên lớp. Bạn có thể sử dụng các nhóm khác nhau trong cùng một vùng chứa và cũng kết hợp hộp kiểm độc quyền với không độc quyền có cùng tên. Mã JavaScript được tối ưu hóa cao. Bạn có thể thấy working example.

1

Bất kể hộp kiểm nằm ở đâu trên trang của bạn, bạn chỉ cần chỉ định nhóm và thông tin cho bạn ở đây!

<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> 
Các vấn đề liên quan