Переключение чекбоксов с помощью jQuery

28 ноября, 2008
toggle checkboxes

На днях мне нужно было написать небольшую JavaScript функцию (на jQuery), которая переключала бы группу чекбоксов. Т.е. все отмеченные чекбоксы должны были стать неотмеченными и наоборот.

Кстати, это довольно широкораспространенная задача.

Количество чекбоксов изменялось динамически и некоторые из них могли быть не активными (их трогать нельзя).

Вобщем, уложился я в шесть строк (включая объявление функции).

  1. function toggleAll() {
  2.     var allCheckboxes = $("#checkboxes input:checkbox:enabled");
  3.     var notChecked = allCheckboxes.not(':checked');
  4.     allCheckboxes.removeAttr('checked');
  5.     notChecked.attr('checked', 'checked');
  6. }

Наверное, код можно еще подсократить, но, честно говоря, думать дальше не хочется :) .

Вкратце поясню, как это работает.

Прежде всего, разметка:

  1. <div id="checkboxes">
  2.     <p><input type="checkbox" /></p>
  3.     <p><input type="checkbox" /></p>
  4.     <p><input type="checkbox" /></p>
  5.     <p><input type="checkbox" /></p>
  6.     <p><input type="checkbox" /></p>
  7.     <p><input type="checkbox" /></p>
  8.     <p><input type="checkbox" /></p>
  9.     <p><input type="checkbox" /></p>
  10. </div>

Обычная группа чекбоксов, которые находятся внутри тега div. В принципе, разметка большой роли не играет. Главное, чтобы вы могли выбрать необходимые чекбоксы.

Алгоритм работы функции.

1) Находим все активные чекбоксы (input:checkbox:enabled).

2) Из них выбираем не отмеченные (not(':checked')).

3) Снимаем отметку у всех чекбоксов (для этого просто удаляем атрибут checked).

4) Отмечаем те чекбоксы, которые были раньше не отмечены (attr('checked', 'checked')).

Как видите, функция получилась довольно короткая.

Если есть идеи как её сократить, буду рад выслушать ;)

Интересно почитать:

Какова ваша отдача от инвестиций в час?

Понравилась статья? Подписывайтесь на продолжение rss link !

Или на мой твиттер twitter link

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в HTML, JavaScript, Web разработка Комментарии (13) »

]]>

Комментарии (13)

Вы можете отслеживать обсуждение записи с помощью RSS 2.0 rss link

Вы также можете оставить комментарий, или трекбек с Вашего сайта.

]]>
  1. Как насчет такого:
    function togCheck(){
    $('#checkboxes input:checkbox').each(function(){this.checked = !this.checked;});
    }

  2. Тогда уж лучше сразу:
    function togCheck(){
    $('#checkboxes input:checkbox:enabled').each(function(){this.checked = !this.checked});
    }

    Есть еще вариант, используя attr, где в качестве второго параметра передается функция:
    function togCheck(){
    $('#checkboxes input:checkbox:enabled').attr
    (
    "checked",
    function()
    {
    return !this.checked;
    }
    );
    }

    PS. Код не тестился, но логику понять можно.

    • А вот это решение мне действительно понравилось. Кстати, у меня заработало :)
      Единственно, вызывает сомнение второй параметр.
      По стандарту должно быть checked="checked", а здесь checked=true, похоже jQuery сама вносит исправления.

  3. Слишком намудрили, Евгений предлогает код попроще.

  4. test

    function VipSeances(){
    $('input.vip').each(function(){
    $(this).attr('disabled',false);

    $('input.vip:checked').each(function(){
    $('input.vip').attr('disabled',true);
    $(this).attr('disabled',false);
    });
    });
    }

  5. test

    код выше допускает только 1 выбранный чекбокс, остальные выключаем

    • Спасибо, интересный пример.

    • Румата

      Подскажите как лаконичнее (короче) реализовать ситуацию когда может быть отмечен только один чекбокс или ни одного?
      $("td.set input:checkbox").change(function(){
      var id=$(this).attr("id");
      $("td.set input:checked").each(function() {
      if ($(this).attr("id")!=id) $(this).attr("checked",false);
      });
      });

      • Как лаконичнее – не подскажу. Но ваш пример с виду рабочий (не проверял) и еще есть пример тремя комментариями выше.

        • Румата

          Да, он у меня используется… Просто не эстетично смотрится промежуточная переменная var id

        • Вы, наверное, видели фильм "Бриллиантовая рука"? ;)

          - Это не эстетично.
          - Зато дёшево, надёжно и практично.

          :)

          А если серьезно, то переменную убрать, скорее всего, получится, но читать при этом код будет наверняка тяжелее.

]]>

Оставить комментарий

* - обязательные для заполнения поля

]]>