![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| 12345c |
|
||||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 2 Всего: 101 |
Предположим, что имеется задача создать двух- или более уровневое меню в списке <select> и при этом нужно подчеркнуть, что выбор раздела означает выбор всех опций раздела - выделить все опции, но не вручную.
Например, на странице "Поиск" этого форума есть такое меню. В нём можно сделать как одиночный, так и множественный выбор. Есть в нём и выбор раздела, при котором автоматического выделения подразделов не происходит, но подразумевается. И вот, мы захотели указать это явно. Понятно, что тег <optgroup label="Раздел ХХ"> не поможет, потому что он приводит к невозможности выделения строки раздела в списке (которая выделена жирным наклонным шрифтом). Зато, строки приходится как-то выделять по отношению к названиям разделов. Воспользуемся этим признаком, чтобы обнаружить, попал выбор на раздел или на обычный пункт. (Можно, конечно, опциям приписать скрытые признаки, но это будет дублирование явных признаков.) Для двухуровневого списка с выделением пунктов специальными символами код для группового выделения раздела будет такой:
Вот как выглядел бы скрипт для выбора групп подразделов форума (скопированный со страницы поиска и урезанный трёхуровневый список). Способ выделения уровней другой, поэтому скрипт несколько другой.
Куда двигаться дальше? Последний пример со сложным длинным двухуровневым списком разжигает аппетиты на усовершенствование скрипта группового выделения. Как показывает непродолжительная работа с результатом, возникают пожелания: 1) сейчас группа только выделяется, а хорошо бы, если бы выделенная группа 2-го уровня снимала выделение по клику на заголовке и удержании Ctrl. 2) если при выделенной группе и удержании Ctrl кликнуть по невыделенной группе выше, то происходит ожидаемое - выделяется 2-я группа, но если кликнуть по невыделенной группе, расположенной ниже - выделится только одна строка (IE, FF). 17.апр.2006 - html-часть примера значительно сокращена, чтобы тема быстрее загружалась. Это сообщение отредактировал(а) 12345c - 17.4.2006, 01:05 -------------------- Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go |
||||
|
|||||
| 12345c |
|
|||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 2 Всего: 101 |
3) Ctrl на фоне выделенной группы не снимает выделение.
(Поправка: этот список не двух-, а трёхуровневый.) Все эти признаки вызваны, как можно догадаться, тем, что selectedIndex при Ctrl (и Shift) не меняет своего положения. Таким образом, в распоряжении нет свойства, показывающего, по какой option кликнули (onclick на option тоже не поддерживается). Для полного комфортного решения понадобится код гораздо большей сложности, эмулирующий обнаружение клика по элементу. Малым увеличением сложности можно обойтись, если просто не обрабатывать клики при нажатой Ctrl или Shift. С учётом замечаний код функции и её вызов становится таким:
Это сообщение отредактировал(а) 12345c - 11.4.2006, 03:55 |
|||
|
||||
| Ciber SLasH |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1813 Регистрация: 9.11.2004 Где: С.-Петербург Репутация: 2 Всего: 67 |
Думаю так будет лучше
здесь была 1-я версия скрипта... Это сообщение отредактировал(а) Ciber SLasH - 17.4.2006, 18:48 |
|||
|
||||
| 12345c |
|
|||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 2 Всего: 101 |
Ciber SLasH, а в чём общий замысел? Ctrl иногда "прорывается" в твоём списке, когда не надо. Это происходит, когда вверху что-то выделено, а кликаешь ниже на заголовок группы. А если на группу сверху, то, наоборот, работает как обычное мультивыделение. Т.е. как противоположность моему первому коду. В моём 2-м коде Ctrl или Shift надёжно отрубают всякую попытку автоматики вмешаться.
|
|||
|
||||
| Ciber SLasH |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1813 Регистрация: 9.11.2004 Где: С.-Петербург Репутация: 2 Всего: 67 |
||||
|
||||
| 12345c |
|
|||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 2 Всего: 101 |
Тут, всё же, несменность selectedIndex всёс портит. Причём, в FF это можно решить, т.к. он понимает клик на option, а в остальных - ...
-------------------- Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go |
|||
|
||||
| Ciber SLasH |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1813 Регистрация: 9.11.2004 Где: С.-Петербург Репутация: 2 Всего: 67 |
Вот, доделал скрипт:
здесь была 2-я версия скрипта... Это сообщение отредактировал(а) Ciber SLasH - 17.4.2006, 18:48 |
|||
|
||||
| 12345c |
|
|||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 2 Всего: 101 |
(Не хватает пояснения, что этот скрипт делает. Поясню для читателей.)
Скрипт Ciber SLasH делает групповое выделение подсписков, если кликнуть по заголовку раздела, выделенному в примере цветом. Кроме этого, если кликнуть по другому разделу, удерживая Ctrl, выделения прежней группы не пропадёт. Заметил недостатки выделений. (Что неудивительно для сложной логики.) 1) если таким способом выделить 2 раздела, а потом кликнуть на одном из выделенных полей, вылетает ошибка (IE). По её причине, вероятно, повторный клик по разделу после ошибки не приводит к групповому автовыделению; 2) если, при Ctrl, убрать все выделения - ошибка; |
|||
|
||||
| Ciber SLasH |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1813 Регистрация: 9.11.2004 Где: С.-Петербург Репутация: 2 Всего: 67 |
3-я версия...
В SELECT-те должны стоять такие события:
Состояния milti-select'а Добавлено @ 18:57 Проверям, тестим на баги... |
||||
|
|||||
| Ciber SLasH |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1813 Регистрация: 9.11.2004 Где: С.-Петербург Репутация: 2 Всего: 67 |
4-я версия:
[+] Теперь можно и снимать выделение с группы, нажав с удержанием <Ctrl> на подкатегории
|
|||
|
||||
| 12345c |
|
||||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 2 Всего: 101 |
Не снимается (IE), кроме 1 строчки. И вернулась ошибка с групповым до-выделением, если кликнуть по группе вверху, но одиночное довыделение, если по группе внизу выделенной группы.
Может быть, хитро над оподключать? Я делал так:
о, так работает исправно, IE,FF1.06 Это сообщение отредактировал(а) 12345c - 20.4.2006, 18:26 |
||||
|
|||||
| Ciber SLasH |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1813 Регистрация: 9.11.2004 Где: С.-Петербург Репутация: 2 Всего: 67 |
12345c, забыл ещё добавить onKeyDown='regKey(event)', т.е.
|
|||
|
||||
| Ciber SLasH |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1813 Регистрация: 9.11.2004 Где: С.-Петербург Репутация: 2 Всего: 67 |
Комментарии и подробности по моей доработки в аттаче...
Присоединённый файл ( Кол-во скачиваний: 27 )
__________________.zip 6,95 Kb |
|||
|
||||
![]()
|
| Здесь публикуют скрипты, которые уже проверены в обсуждениях других тем (при этом полезно поставить ссылки на все смежные обсуждения) или переносятся кем-либо из модераторов по просьбе участников, если видно, что в результате обсуждения темы был написан полезный или интересный скрипт. Третий возможный вариант - участник форума публикует скрипт, заведомо известный как полезный и эффективный, для, возможно, небольшой доработки и обсуждения. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Наши скрипты | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |