Blog. Just Blog

Групповой выбор checkbox'ов на JavaScript

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Групповой выбор checkbox'ов на JavaScript
Групповой выбор checkbox'ов на JavaScript

В некоторых пользовательских интерфейсах в рабочих проектах приходится сталкиваться с длинными таблицами. Одна из колонок в такой таблице - чекбокс, которым отмечаются строки, с которыми надо выполнить то или иное действие. При выборе пары-тройки чекбоксов проблем не возникает, один клик - один чекбокс. В шапке колонки есть мастер-чекбокс, с помощью которого можно отметить все или снять все галочки. А вот при необходимости отметить не все, но просто большое количество чекбоксов начинаются сложности. По одному делать это долго. Но ведь даже в стандартном Проводнике есть возможность выбирать последовательность файлов, отмечая чекбоксы с зажатой клавишей Shift. Такая идея мне понравилась и я перенес ее на веб-страницы.

Начнем с верстки строк таблицы. Они должны иметь примерно такой вид. Атрибут id имеет значение в формате "chk_#", где счетчик начинается с 1 и увеличивается на каждой строке. Обработчик устанавливается на событие click. Для удобства восприятия я прописал обработчики inline, в рабочем коде, конечно, это все назначается динамически.
  1. <tr>
  2.     <td><input type="checkbox" id="chk_1" onclick="chk_checkbox(1, event);"/></td>
  3.     <td>Checkbox 1</td>
  4. </tr>
  5. <tr>
  6.     <td><input type="checkbox" id="chk_2" onclick="chk_checkbox(2, event);"/></td>
  7.     <td>Checkbox 2</td>
  8. </tr>
  9. <tr>
  10.     <td><input type="checkbox" id="chk_3" onclick="chk_checkbox(3, event);"/></td>
  11.     <td>Checkbox 3</td>
  12. </tr>
Если происходит клик по одиночному чекбоксу и галочка взводится, то глобальной переменной old_chk назначается значение начала интервала. Если ставится галочка с зажатым Shift'ом, то проставляются галочки на все чекбоксы от old_chk до индекса активируемого чекбокса. Обратной операции, то есть снятия галочек, не предусмотрено.
  1. // Последняя нажатая галочка
  2. var old_chk=0;
  3.  
  4. function chk_checkbox(numevent) {
  5.     var el=document.getElementById('chk_'+num);
  6.     // Чекбокс активирован?
  7.     if (el && el.checked) {
  8.         // Клавиша Shift нажата?
  9.         if (event.shiftKey) {
  10.             if (old_chk!=0) {
  11.                 // При необходимости поменять границы
  12.                 if (num<old_chk) {
  13.                     var tmp=old_chk;
  14.                     old_chk=num;
  15.                     num=tmp;
  16.                 }
  17.                 // Проставить все галочки в диапазоне
  18.                 for(var i=old_chki<=numi++) {
  19.                     el=document.getElementById('chk_'+i);
  20.                     if (el) {
  21.                         el.checked=true;
  22.                     }
  23.                     else {
  24.                         break;
  25.                     }
  26.                 }
  27.                 // Новое начало диапазона
  28.                 old_chk=num;
  29.             }
  30.         }
  31.         else {
  32.             // Новое начало диапазона
  33.             old_chk=num;
  34.         }
  35.     }
  36.     else {
  37.         // Сбросить границу диапазона
  38.         old_chk=0;
  39.     }
  40. }
Получилось, на мой взгляд, даже лучше, чем в Проводнике. Интервалов в колонке может быть несколько, они выбираются независимо, интервалы могут пересекаться.

Ну и чтобы два раза не вставать, вот верстка и обработчик мастер-чекбокса, который снимает или устанавливает галочки на всех чекбоксах.
  1. <table>
  2. <tr>
  3.     <th><input type="checkbox" id="group_select" onclick="chk_all();"/></th>
  4.     <th>Header</th>
  5.     <th>Some data</th>
  6.     <th>Text</th>
  7. </tr>
  1. function chk_all() {
  2.     var i=1;
  3.     var el;
  4.     // Получить состояние мастер-чекбокса
  5.     var chk=document.getElementById('group_select').checked;
  6.     // Привести все чекбоксы к состоянию мастер-чекбокса
  7.     while (el=document.getElementById('chk_'+i)) {
  8.         el.checked=chk;
  9.         i++;
  10.     }
  11. }
Пример таблицы с чекбоксами вы можете посмотреть на демонстрационной странице. Галочки можно менять через мастер-чекбокс в заголовке таблицы, кликами на отдельных чекбоксах и выбирать интервалы с зажатой клавишей Shift.

Поделиться ссылкой ВКонтакте
Просмотров: 348 | Комментариев: 9

Комментарии

Отзывы посетителей сайта о статье
Ирина (02.11.2024 в 09:50):
Спасибо большое за Ваше внимание!
ManHunter (01.11.2024 в 22:25):
Обратиться к разработчикам этой чудо-системы, пусть исправляют свои косяки. Других вариантов тут не может быть.
Ирина (01.11.2024 в 22:24):
Спасибо за ответ!
А что можно сделать, подскажите, пожалуйста.
ManHunter (01.11.2024 в 11:06):
Это ничем не поможет, тем более в приведенном фрагменте вообще нет ни единого чекбокса.
Ирина (01.11.2024 в 07:45):
Здравствуйте!
Я не программист и ничего в этом не понимаю.
Но, мне нужна Ваша помощь.
В кратце: в браузере (яндекс) расписываю документы в системе электронного документооборота, на странице отображается список из 50 документов (в виде строк), на каждой строке есть "галочка" (чек-бокс), которую можно проставить на нужных документах и создать одинаковую резолюцию по группе выделенных документов. Т.к. документов очень много, они типовые, резолюции по ним одинаковые, то я бы хотела выбирать единоразово все 50 галочек на странице и создавать резолюцию.
Но, проблема в том, что галочки выбираются только кликом. Советы про удержание кнопки shift и выделением диапазона галочек - не помогают.
Начиталась всякого в интернете и поняла, что на странице, видимо, какой блок  стоит. В коде страницы нашла такие слова как selectByClick.
Я вообще не умею работать с яваскрипт. Пыталась по советам яндекса открыть консоль и вставить туда Ваши коды, ничего не вышло.
Но, наверняка, я что-то не правильно делаю.
Если Вас не затруднит, помогите, пожалуйста.
На меня падает тысячи документов в день и щелкать галочки устает рука, да и трата времени на щелкание удручает.
Спасибо большое!

<div id="Template_VerticalListStrategies_chooseEmailCorrespondents_Vie w">
    <table>
        <tr>
            <td style="width:32px">
                <div class="attr_checkBox"></div>
            </td>
            <td style="width: 18px" class="selectByClick">
                <div class="attr_sourceType" style="height: 16px; width: 16px; margin-left: 5px"></div>
            </td>
            <td style="width: 100%; padding-right: 3px" class="selectByClick">
                <span class="WbForm_AttributeValue attr_name"></span>
            </td>
            <td style="width: 32px; padding-right: 3px">
                <div class="btn_edit"></div>
            </td>
        </tr>
    </table>
</div>

Может быть это Вам поможет разобраться...
DiPrm (30.07.2024 в 13:18):
Да, у каждого свои предпочтения. Главное, задумка хорошая!
ManHunter (25.07.2024 в 21:13):
Ну я ж не претендую на истину в последней инстанции. Мне удобно именно в таком виде, если брать как основу, то можно наворотить как угодно.
DiPrm (25.07.2024 в 17:19):
Немного доработал функционал. В строку 30 после скобки добавил old_chk = num. В функции chk_all обнулил old_chk. Теперь можно выбирать диапазон сразу с нажатой клавишей shift. Если сделать ресет чекбоксов, выбранный диапазон обнуляется. Так, мне кажется, удобнее.
DiPrm (23.07.2024 в 22:28):
Спасибо, красивое решение! Особенно понравился код -  перебор элементов при условии если такой элемент найден.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0037 сек.) / Память: 4.5 Mb
Наверх