Включить / выключить флажки

397

У меня есть следующее:

$(document).ready(function()
{
    $("#select-all-teammembers").click(function() {
        $("input[name=recipients\\[\\]]").attr('checked', true);
    });                 
});

Я хотел бы, чтобы id="select-all-teammembers"при нажатии переключался между проверенным и непроверенным. Идеи? это не десятки строк кода?

AnApprentice
источник

Ответы:

723

Ты можешь написать:

$(document).ready(function() {
    $("#select-all-teammembers").click(function() {
        var checkBoxes = $("input[name=recipients\\[\\]]");
        checkBoxes.prop("checked", !checkBoxes.prop("checked"));
    });                 
});

До jQuery 1.6, когда у нас был только attr (), а не prop () , мы писали:

checkBoxes.attr("checked", !checkBoxes.attr("checked"));

Но prop()имеет лучшую семантику, чем attr()при применении к «логическим» атрибутам HTML, поэтому обычно в этой ситуации предпочтительнее.

Фредерик Хамиди
источник
4
Это может запутаться, так как основывает статус на первом (так что, если пользователь проверит первый, а затем использует тумблер, он выйдет из синхронизации). Слегка подправлен, поэтому он основывает состояние переключателя, а не первый флажок в списке: $ ("input [name = receients \ [\]]"). Prop ("checked", $ (this) .prop (" проверено "));
CookiesForDevo
6
Использование 'prop' делает эту работу и для Zepto. В противном случае он установит флажок, но не снимет флажок.
SimplGy
1
«prop» вместо «attr» добился цели: с «attr» он переключается на некоторое время, а затем останавливается, с «prop» вместо этого он переключается, как и ожидалось. +1 за обновление.
TechNyquist
11
$('input[type=checkbox]').trigger('click');упомянутое @ 2astalavista ниже является более кратким и также вызывает событие «изменения».
здесь
1
не могли бы вы отредактировать свой ответ, чтобы поддержать ответ @ CookiesForDevo
acquayefrank
213
//this toggles the checkbox, and fires its event if it has    

$('input[type=checkbox]').trigger('click'); 
//or
$('input[type=checkbox]').click(); 

источник
Работает в Chrome 29, но не в FF 17.0.7, кто-то может это подтвердить?
Гриддо
Я так долго собирался поменять недвижимость. Для меня это отличный и более гибкий подход для проверки и снятия отметки с элементов флажка.
Исиома Ннодум
Нежелательное событие вызвано.
Джехонг Ан
Для флажков, как правило, более целесообразно запускать событие 'change', поскольку их можно изменить, щелкнув метку.
Питер Ленджо
61

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

Для этого ни одно из решений здесь не работает, поскольку они заставляют все флажки иметь одинаковое состояние, а не переключать состояние каждого флажка. Выполнение $(':checkbox').prop('checked')многих флажков возвращает логическое И между всеми .checkedдвоичными свойствами, т. Е. Если одно из них не проверено, возвращается значение false.

Вам нужно использовать, .each()если вы хотите фактически переключать каждое состояние флажка, а не делать их все равными, например

   $(':checkbox').each(function () { this.checked = !this.checked; });

Обратите внимание, что вам не нужно $(this)внутри обработчика, так как .checkedсвойство существует во всех браузерах.

Normadize
источник
5
Да, это правильный ответ на переключение состояния всех флажков!
Сидвелл
1
На несколько порядков быстрее, чем запускать клики с помощью jQuery, когда у вас много флажков.
Джереми Кук
16

Вот еще один способ, который вы хотите.

$(document).ready(function(){   
    $('#checkp').toggle(
        function () { 
            $('.check').attr('Checked','Checked'); 
        },
        function () { 
            $('.check').removeAttr('Checked'); 
        }
    );
});
KST
источник
9
Это не переключение.
AgentFire
2
@kst - это лучший метод $ ('input [name =ципиенты \ [\]]'). toggle (this.checked); Забудь о занятиях.
Дэвис
11

Я думаю, что проще просто вызвать клик:

$("#select-all-teammembers").click(function() {
    $("input[name=recipients\\[\\]]").trigger('click');
});                 
Мэтт Бернс
источник
9

Лучший способ, который я могу придумать.

$('#selectAll').change(function () {
    $('.reportCheckbox').prop('checked', this.checked);
});

или

$checkBoxes = $(".checkBoxes");
$("#checkAll").change(function (e) {
    $checkBoxes.prop("checked", this.checked);
});   

или

<input onchange="toggleAll(this)">
function toggleAll(sender) {
    $(".checkBoxes").prop("checked", sender.checked);
}
Dblock247
источник
8

Начиная с jQuery 1.6 вы можете использовать, .prop(function)чтобы переключать проверенное состояние каждого найденного элемента:

$("input[name=recipients\\[\\]]").prop('checked', function(_, checked) {
    return !checked;
});
Джек
источник
Отличный ответ. Вы знаете больше о передаче подчеркивания в качестве первого параметра? Где я могу узнать больше об этом?
user1477388 9.09.16
1
Редактировать: По-видимому, это, по сути, средство для передачи null stackoverflow.com/questions/11406823/…
user1477388
8

Используйте этот плагин:

$.fn.toggleCheck  =function() {
       if(this.tagName === 'INPUT') {
           $(this).prop('checked', !($(this).is(':checked')));
       }

   }

затем

$('#myCheckBox').toggleCheck();
Абденнур ТУМИ
источник
2

Предполагая, что это изображение, которое должно переключаться флажок, это работает для меня

<img src="something.gif" onclick="$('#checkboxid').prop('checked', !($('#checkboxid').is(':checked')));">
<input type="checkbox" id="checkboxid">
user1428592
источник
4
Поскольку это ваш первый ответ, поймите, что чаще всего лучше всего следовать шаблону, который использовался в вопросе, а именно: поместить код jQuery в обработчик документов, а не в строку в разметке. Если у вас есть причина НЕ делать этого, добавьте объяснение, почему.
Марк Шультейс
2

Check-all checkbox должен обновляться сам при определенных условиях. Попробуйте нажать на «# select-all-teammembers», затем уберите галочку с нескольких пунктов и снова нажмите «select-all». Вы можете увидеть несоответствие. Чтобы предотвратить это, используйте следующий трюк:

  var checkBoxes = $('input[name=recipients\\[\\]]');
  $('#select-all-teammembers').click(function() {
    checkBoxes.prop("checked", !checkBoxes.prop("checked"));
    $(this).prop("checked", checkBoxes.is(':checked'));
  }); 

Кстати, все флажки DOM-объекта должны быть кэшированы, как описано выше.

Анатолий
источник
2

Вот способ jQuery для переключения флажков без необходимости устанавливать флажок с html5 & ярлыками:

 <div class="checkbox-list margin-auto">
    <label class="">Compare to Last Year</label><br>
    <label class="normal" for="01">
       <input id="01" type="checkbox" name="VIEW" value="01"> Retail units
    </label>
    <label class="normal" for="02">
          <input id="02" type="checkbox" name="VIEW" value="02">  Retail Dollars
    </label>
    <label class="normal" for="03">
          <input id="03" type="checkbox" name="VIEW" value="03">  GP Dollars
    </label>
    <label class="normal" for="04">
          <input id="04" type="checkbox" name="VIEW" value="04">  GP Percent
    </label>
</div>

  $("input[name='VIEW']:checkbox").change(function() {
    if($(this).is(':checked')) {  
         $("input[name='VIEW']:checkbox").prop("checked", false);
     $("input[name='VIEW']:checkbox").parent('.normal').removeClass("checked");
         $(this).prop("checked", true);
         $(this).parent('.normal').addClass('checked');
    }
    else{
         $("input[name='VIEW']").prop("checked", false);
         $("input[name='VIEW']").parent('.normal').removeClass('checked');
    }    
});

http://www.bootply.com/A4h6kAPshx

yardpenalty.com
источник
1

если вы хотите переключать каждый блок отдельно (или только один блок работает так же хорошо):

Я рекомендую использовать .each (), так как его легко изменить, если вы хотите, чтобы происходили разные вещи, и все же он относительно короткий и легко читаемый.

например:

// toggle all checkboxes, not all at once but toggle each one for its own checked state:
$('input[type="checkbox"]').each(function(){ this.checked = ! this.checked });

// check al even boxes, uncheck all odd boxes:
$('input[type="checkbox"]').each(function(i,cb){ cb.checked = (i%2 == 0); });

// set all to checked = x and only trigger change if it actually changed:
x = true;
$('input[type="checkbox"]').each(function(){
    if(this.checked != x){ this.checked = x; $(this).change();}  
});

на заметку ... не знаю, почему все используют .attr () или .prop (), чтобы (не) проверять вещи.

насколько я знаю, element.checked всегда работал одинаково во всех браузерах?

Moonlite
источник
1
jQuery("#checker").click(function(){
    jQuery("#mydiv :checkbox").each(function(){
        this.checked = true;
    });
});
jQuery("#dechecker").click(function(){
    jQuery("#mydiv :checkbox").each(function(){
        this.checked = false;
    });
});
jQuery("#checktoggler").click(function(){
    jQuery("#mydiv :checkbox").each(function(){
        this.checked = !this.checked;
    });
});

;)

ГиголНет Гиголачвили
источник
1

Вы можете написать так же

$(function() {
    $("#checkbox-toggle").click(function() {
        $('input[type=checkbox][name=checkbox_id\\[\\]]').click();
    });
});

Просто нужно вызвать событие нажатия флажка, когда пользователь нажимает кнопку с идентификатором «# checkbox-toggle».

Милан Малани
источник
1

Лучший подход и UX

$('.checkall').on('click', function() {
   var $checks  = $('checks');
   var $ckall = $(this);

    $.each($checks, function(){
        $(this).prop("checked", $ckall.prop('checked'));
    });
});

$('checks').on('click', function(e){
   $('.checkall').prop('checked', false);
});
Хьюго Диас
источник
1
<table class="table table-datatable table-bordered table-condensed table-striped table-hover table-responsive">
<thead>
    <tr>
        <th class="col-xs-1"><a class="select_all btn btn-xs btn-info"> Select All </a></th>
        <th class="col-xs-2">#ID</th>
    </tr>
</thead>
<tbody>
    <tr>
        <td><input type="checkbox" name="order333"/></td>
        <td>{{ order.id }}</td>
    </tr>
    <tr>
        <td><input type="checkbox" name="order334"/></td>
        <td>{{ order.id }}</td>
    </tr>
</tbody>                  
</table>

Пытаться:

$(".table-datatable .select_all").on('click', function () {
    $("input[name^='order']").prop('checked', function (i, val) {
        return !val;
    });
});
Кароль Гонтарски
источник
1

Этот работает очень хорошо для меня.

   $("#checkall").click(function() {
       var fruits = $("input[name=fruits\\[\\]]");
        fruits.prop("checked", $(this).prop("checked"));
    });
sovantha
источник
1
вы действительно понимаете, что присваиваете «проверенному» свойству то же значение, которое оно уже имеет, верно? это не немного смущает? Вы, очевидно, хотели поставить !знак перед этим ..
vsync
1

Самый простой пример будет:

// get DOM elements
var checkbox = document.querySelector('input'),
    button = document.querySelector('button');

// bind "cilck" event on the button
button.addEventListener('click', toggleCheckbox);

// when clicking the button, toggle the checkbox
function toggleCheckbox(){
  checkbox.checked = !checkbox.checked;
};
<input type="checkbox">
<button>Toggle checkbox</button>

VSync
источник
1

просто вы можете использовать это

$("#chkAll").on("click",function(){
    $("input[name=checkBoxName]").prop("checked",$(this).prop("checked"));
});
Фуад Мекки
источник
0

На мой взгляд, самый правильный человек, предложивший нормальный вариант - это GigolNet Gigolashvili, но я хочу предложить еще более красивый вариант. Проверь это

$(document).on('click', '.fieldWrapper > label', function(event) {
    event.preventDefault()
    var n = $( event.target ).parent().find('input:checked').length
    var m = $( event.target ).parent().find('input').length
    x = n==m? false:true
    $( event.target ).parent().find('input').each(function (ind, el) {
        // $(el).attr('checked', 'checked');
        this.checked = x
    })
})
Артур Султ
источник
0

Установка 'флажка' или нуля вместо истины или ложи соответственно сделает работу.

// checkbox selection
var $chk=$(':checkbox');
$chk.prop('checked',$chk.is(':checked') ? null:'checked');
IPSingh
источник
0

Этот код будет переключать флажок при нажатии любого аниматора переключателя, используемого в веб-шаблонах. Замените ".onoffswitch-label" как доступный в вашем коде. «checkboxID» - это флажок, установленный здесь.

$('.onoffswitch-label').click(function () {
if ($('#checkboxID').prop('checked')) 
 {
   $('#checkboxID').prop('checked', false);
 }
else 
 {
   $('#checkboxID').prop('checked', true);
 }
});
Пранеш Джанартанан
источник
-3

Ну есть более простой способ

Сначала дайте вашим флажкам пример класса 'id_chk'

Затем внутри чекбокса, который будет контролировать состояние чекбоксов 'id_chk', положите:

<input type='checkbox' onchange='js:jQuery(".id_chk").prop("checked", jQuery(this).prop("checked"))' />

Вот и все, надеюсь, это поможет

ангел
источник