2011-02-01 4 views
1

Мне нужно создать несколько групп для флажков. Как и в случае, если у меня есть 3 флажка с 'value = "group1"', это позволяет мне только выбрать один из флажков, а каждый флажок под этой группой будет отменен. Я получил на полпути, чтобы я мог фильтровать флажки на основе их групп, и я могу установить их в false. Проблема заключается в том, что установите флажок для правильного флажка обратно на «проверено». Я думаю, что для этого я могу использовать неправильный метод, потому что кажется, что я мешаю им быть выбранным все время ... Так что, может быть, есть еще один способ решить это?jQuery checkbox groups

Вы можете увидеть мой текущий JS скрипку здесь: http://www.jsfiddle.net/Rph8z/

+7

Почему вы не используете радиокнопки? Для этого они и есть. Используйте радиокнопки, если нужно выбрать только * один * элемент группы и флажки для нескольких. Вот ваша обновленная скрипка: http://www.jsfiddle.net/Rph8z/2/ (у них должно быть одно и то же имя). –

+0

Должна быть опция для того, чтобы ничего не выбрать, вы не можете отменить выбор переключателя, если только вы не создадите новый параметр, который будет отмечен как «none», но мне это не нравится. – WraithLux

+0

Почему бы и нет?Если бы мне пришлось выбирать между значением «none» и решением, которое в основном пытается реплицировать уже существующее поведение с использованием JavaScript и не будет работать, если JS отключен, я бы явно выбрал «none». Кроме того, для пользователя может быть проще понять, есть ли (предварительно выбранный) параметр «none», но это зависит от контекста. –

ответ

5

мы используем флажки, потому что мы хотим, чтобы пользователи могли проверить более чем один ответ

если вы хотите разрешить только один ответ, вы должны использовать переключатели. это стандарт.

, если вы настаиваете на оригинальный способ есть правильный код:

$(".selector").children("input:checkbox").click(function(e){ 
var test = $(this).val(); 
if($(this).attr('checked')==true) { 
    $('input[value='+test+']').each(function() { 
    $(this).attr('checked',false); 
}) 

    $(this).attr('checked',true) 
} 
}); 

at JSFIDDLE

+0

Это намного сложнее, чем нужно. Просто используйте селектор для значения. –

+0

Спасибо, это сделало то, что я просил. Это немного изменило использование селектора, как предположил Джаред. – WraithLux

1

Как @Felix отмечает в своем комментарии, вы используете неправильный инструмент для работы. Радио кнопки будет гораздо проще и гораздо более разумным (так как вы хотите, только один из них должен быть выбран:.

<input type="radio" name="radioGroup" value="1" id="radio1" /><label for="radio1">Radio 1</label> 
<input type="radio" name="radioGroup" value="2" id="radio2" /><label for="radio2">Radio 2</label> 
<input type="radio" name="radioGroup" value="3" id="radio3" /><label for="radio3">Radio 3</label> 
<input type="radio" name="radioGroup" value="4" id="radio4" /><label for="radio4">Radio 4</label> 

JS Fiddle demo

+0

Я знаю о радиообменах, конечно, но мой пример требует использования флажков, я считаю, что для одной группы я должен выбрать 2 варианта и т. Д. Поэтому флажки будут единственным способом для меня ... – WraithLux

+0

@WraithLux: так что я понятен, у вас есть следующие требования: ** 1: ** выбор должен быть возможен, и ** 2: ** выбор более одного варианта должен быть возможен? –

+0

@WraithLux: даже тогда вам придется добавить некоторую проверку на стороне сервера и убедиться, что весь процесс работает, не заставляя пользователя выбирать только 2 варианта: 1. Поскольку JS можно отключить и 2. поскольку HTTP-запросы могут быть подделаны , Никогда не доверяйте пользователю. –

0

Я предложил бы использовать класс вместо типа

.
<div class="selector"> 
<input type=checkbox class="serialcheck" name="hello" value="test"/> Hello 
<input type=checkbox class="serialcheck" name="bye" value="test"/> Bye 
<input type=checkbox class="serialcheck" name="no" value="test2"/> No 
<input type=checkbox class="serialcheck" name="no no" value="test2"/> No No 
</div> 

Действительно, вам просто нужно выбрать все, кроме того, что в настоящее время стрельбы это OnClick событие:

$(".selector input.serialcheck").click(function(){ 
    var test = $(this).val(); 
    $(".selector input.serialcheck[value!="+test+"]").attr('checked', false); 
}); 

Если вы хотите, чтобы выбрать все те, с тем же значением, добавьте еще одну строку:

$(".selector input.serialcheck").click(function(){ 
    var test = $(this).val(); 
    $(".selector input.serialcheck[value!="+test+"]").attr('checked', false); 
    $(".selector input.serialcheck[value="+test+"]").attr('checked', true); 
}); 
+0

не будет работать, потому что 'hello' и' goodbye' имеют одинаковое значение – hunter

+0

Зависит от того, хочет ли он выбрать по значению или просто ключ/значение. Я добавил еще одну строку, чтобы показать, как делать то, что вы предлагаете. –

0

Почему не Тринг это:

// now its only watch to the checkbox where the name IS NOT test 
$(".selector input[type=checkbox][name!=test]").click(function(){ 
    ** 
    $(this).attr('checked', true); 
}); 

** if you only want that there is ONE selected at all time, add this code BEFORE you set the attribute checked: 
$(".selector input[type=checkbox]:checked").removeAttr('checked'); 


// when you group by you can only use it on the name not the value 
<div class="selector"> 
    <input type=checkbox value="hello" name="test"/> 
    <input type=checkbox value="bye" name="test"/> 
    <input type=checkbox value="no" name="test2"/> 
    <input type=checkbox value="no no" name="test2"/> 
</div> 

// if you want to use it more but with different value 
$(".selector input[type=checkbox]").click(function(){ 

    var currName = $(this).attr('name'); 

    //watch if there already is a checkbox checked with the same name 
    $(".selector input[type=checkbox][name="+ currName +"]:checked").removeAttr('checked'); // or .attr('checked', false); 

    // now set the checkbox you clicked on it to true 
    $(this).attr('checked', true); 
}); 
1

Это уборщик версия, основанная на предыдущих ответах

HTML

<input type="checkbox" class="checkboxgroup" value="1"> 
<input type="checkbox" class="checkboxgroup" value="2"> 

JavaScript

$('.checkboxgroup').click(function(e){ 
    var val = $(this).val(); 
    $('input[value!='+val+'].checkboxgroup').attr('checked',false); 
}); 

Флажки могут быть в любом месте на странице, просто дать им класс checkboxgroup.

+1

С новыми версиями jQuery используйте prop() вместо attr() для «checked», а также такие вещи, как «disabled» и т. Д. – schwabsauce