Выделяем/снимаем выделение со всех чекбоксов

На мой взгляд, весьма напрягает отмечать множество чекбоксов. Уж больно нервы выматывает,особенно если их много и отметить надо все. И так,решение данной проблемы.

Решение было найдено Дэвидом Уолшем и написано на MooTools 1.2. Допустим мы имеем следующий код:

   <table>
       <tr>
           <th width="30"><img src="checkboxes/uncheck.jpg" id="ucuc" /></th><th>Title</th>
       </tr>
       <tr>
           <td><input type="checkbox" name="approve[]" class="check-me" value="Braveheart" /></td>
           <td>Braveheart</td>
       </tr>
       <tr>
           <td><input type="checkbox" name="approve[]" class="check-me" value="Gladiator" /></td>
           <td>Gladiator</td>
       </tr>
       <tr>
           <td><input type="checkbox" name="approve[]" class="check-me" value="The Patriot" /></td>
           <td>The Patriot</td>
       </tr>
       <tr>
           <td><input type="checkbox" name="approve[]" class="check-me" value="300" /></td>
           <td>300</td>
       </tr>
  </table>

Примечание: картинка с ID “ucuc” яляется своеобразной заглушкой. Посмотрев пример все поймете ;)

В CSS добавим ID. Сделаем наш код более юзабильным путем добавления указателя на изображение.

#ucuc	{ cursor:pointer; }

Ну а теперь сам код MooTools

window.addEvent('domready', function() {
	$('ucuc').addEvent('click', function() {
		if($('ucuc').get('rel') == 'yes')
		{
			do_check = false;
			$('ucuc').set('src','checkboxes/uncheck.jpg').set('rel','no');
		}
		else
		{
			do_check = true;
			$('ucuc').set('src','checkboxes/check.jpg').set('rel','yes');
		}
		$$('.check-me').each(function(el) { el.checked = do_check; });
	});
});

Вот собственно и все. Очень и очень лего,зато пользы от такой фишки немало ;)

Обещанный пример.

Случайные посты:
  1. bPerfection 08: bPerfDynamic
  2. Elegance
  3. polaris

4 комментария

  1. Maksim Horbachevsky:

    Странно как-то. Зачем использовать картинку вместо стандартного инпута. Тут 2 явных минуса. Первый - лишние кб(мелочь, но все же) загрузки (кстати, при достаточно хорошем коннекте картинка “checked” загрузилась не сразу - тогда уж делать предзагрузку с Assets или через background-position). Второй минус - то, что чекбоксы у всех браузеров разные (да и темы для ОС их тоже изменяют), поэтому мне лично будет неприятен чекбокс, выбивающийся из общей тематики. Но, на мой взгляд все это упрощается заменой картинку обычным инпутом. Да и код уменьшается до безобразно короткого:

    window.addEvent(’domready’, function() {
    $(’ucuc’).addEvent(’click’, function() {
    $$(’.check-me’).each(function(el) { el.checked = this.checked; }, this);
    });
    });

    Хотя и в нем желательно сделать поправки (поиск по имени, а не классу (зачем же вводить лишние классы, если имя - в любом случае будет у всех чекбоксов):

    $(’ucuc’).addEvent(’click’, function() {
    $$(’input[name*="approve"]‘).each(function(el) { el.checked = this.checked; }, this);
    });

    (здесь поиск элементов не претендует на универсальность, но как вариант, думаю, подойдет)

    А еще круче было бы сделать ф-цию, которая бы вешала на один чекбокс возможность отмечать другие. Но при условии, что все они отмечены, а мы нажимаем на любой из них (не на глобальный чек), то с глобального чекбокса (тот, которые может отметить всех остальных) снимался статус “checked”. Еще лучше, если она (ф-ция) будет сделана как расширение для класса Element, чтобы не париться, а писать что-то вроде

    $(’ucuc’).globalCheckFor(”approve”);

    Если будет надобность - накидаю примерчик.

    [Ответить]

    rsboarder:

    Вашу мысль понял и признаю свою неправоту. Рациональнее было б сделать именно так, как вы описали. Спасибо за критику ;) Принял к сведенью.

    [Ответить]

  2. Maksim Horbachevsky:

    Рад был помочь :) Надеюсь, кому-нибудь пригодится

    [Ответить]

    rsboarder:

    конечно пригодится ;)

    [Ответить]

Оставьте свой отзыв!

XHTML:
Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>