Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 08.03.2019
Сообщений: 141

Переключение указателя направления для стандартного выпадающего меню с использованием select

16.12.2024, 12:55. Показов 682. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Видимо не хватает знаний или понимания работы некоторых методов, поэтому решил обратиться за помощью к специалистам:

Тема не раз поднималась, в частности кто-то предлагал использовать определение фокуса. Подумал, что использование EventListener более правильно. Но, при раскрытии меню сразу же по клику срабатывает document.addEventListener('click', vMen_clos); из vMen_open (e).

Код:

HTML5
1
2
3
4
5
6
7
8
9
10
    <div class= "v_men">
      <span > Город:  </span>
      <div id= "v_men" class= " men_reg down">
        <select name="reg1" onchange="izm_region (this.value)">
            <option name="reg1" value="0" > Москва  </option>
            <option name="reg1" value="1" > С-Петербург </option>
            <option name="reg1" value="1" > Кишинев </option>
        </select>
      </div>
    </div>

CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
.v_men {
  display: inline;  
  width: 250px;
  margin-left: 10px;
}
 
.men_reg    {
    position: absolute;
}
 
.men_reg select {
    width: 200px;
    height: 35px;
    padding: 2px 10px;
    border: none;
    outline: none;
  color: yellow;
  background-color: black;
  font-size: 18px;
}
 
.men_reg::before {
    width: 50px;
    height: 50px;
    position: relative;
      top: 1px;
     right: -200px;
 
    text-align: center;
    line-height: 50px;
    font-size: 28px;
    color: #fff;
    pointer-events: none;
}
.men_reg:hover::before  {
    background-color: yellow;
}
 
.down::before {
    content: "▽";     
     background-color: magenta;
 
}
.up::before {
    content: "△";
    background-color: blue;
}

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 document.querySelector("#v_men").addEventListener('click', vMen_open, true);   
 
 function vMen_open (e) {
    let rec = document.querySelector('#v_men');
    rec.classList.remove("down");
    rec.classList.add("up");
    document.querySelector("#v_men").removeEventListener('click', vMen_open);
 
    document.addEventListener('click', vMen_clos);  
 
 }
 
 function vMen_clos ()  {
    let rec = document.querySelector('#v_men');
    rec.classList.remove("up");
    rec.classList.add("down");  
    document.removeEventListener('click', vMen_clos);   
 }
 
          
function izm_region (prm)   {
 
    vMen_clos ();
 
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.12.2024, 12:55
Ответы с готовыми решениями:

Изменение стандартного цвета MenuItem и выпадающего меню
Добрый день всем. Есть приложение, задний фон у него черного цвета. Текст MenuStrip белый. Когда щелкаю по менюшке мышью, из-за белого...

Обработчик для выпадающего списка <select></select>
Всем добрый день такой вопрос- пишу админку и на странице добавления товара была такая форма &lt;div...

Меню с использованием <select>
Здравствуйте, думаю можно реализовать нечто подобное, но, по незнанию JAVA где-то косячу. Ткните носом, пожалуйста. &lt;script&gt; var...

10
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3819 / 1657 / 428
Регистрация: 14.03.2022
Сообщений: 4,133
16.12.2024, 14:16
dav60, в чем собственно проблема?
0
1 / 1 / 0
Регистрация: 08.03.2019
Сообщений: 141
16.12.2024, 14:49  [ТС]
krvsa, ghj, хочу, чтобы:
при раскрытии/закрытии меню стрелка поворачивалась на 90 градусов.

• В данном коде Проблема в том, что при раскрытии меню должен был бы только устанавливаться обработчик addEventListener('click', vMen_clos), но он не только устанавливается, но и сразу же выполняется function vMen_clos () (разместил alert в ф-цию и он сразу же срабатывает) - как понял, на нее сразу же распространяется событие клик на элементе.

Ps
Не хотел преждевременно озвучивать, чтобы не влиять на предложенный результат, но, если добавить e.stopPropagation(); e.preventDefault(); в vMen_open (e) (возможно, достаточно только e.stopPropagation(); - почему-то ранее у меня не работало, а сейчас получается):

JavaScript
1
2
3
4
5
6
7
8
9
 function vMen_open (e) {
    let rec = document.querySelector('#v_men');
    rec.classList.remove("down");
    rec.classList.add("up");
    document.querySelector("#v_men").removeEventListener('click', vMen_open);
    e.stopPropagation();
    e.preventDefault();
    document.addEventListener('click', vMen_clos);  
 }
, то стрелка поворачивается, но в таком случае ее не удается вернуть в случае клика по меню (по документу работает)
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3819 / 1657 / 428
Регистрация: 14.03.2022
Сообщений: 4,133
16.12.2024, 16:36
Цитата Сообщение от dav60 Посмотреть сообщение
хочу, чтобы:
при раскрытии/закрытии меню стрелка поворачивалась на 90 градусов.
Если речь про "стрелку" - можно рассмотреть вот такой вариант...

Кликните здесь для просмотра всего текста
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
 
<style>
.v_men {
  display: inline;  
  width: 250px;
  margin-left: 10px;
}
 
.men_reg    {
    position: absolute;
}
 
.men_reg select {
    width: 200px;
    height: 35px;
    padding: 2px 10px;
    border: none;
    outline: none;
  color: yellow;
  background-color: black;
  font-size: 18px;
}
 
.men_reg::before {
    width: 50px;
    height: 50px;
    position: relative;
      top: 1px;
     right: -200px;
 
    text-align: center;
    line-height: 50px;
    font-size: 28px;
    color: #fff;
    pointer-events: none;
}
.men_reg:hover::before  {
    background-color: yellow;
}
 
.down::before {
    content: "▽";     
     background-color: magenta;
 
}
.up::before {
    content: "△";
    background-color: blue;
}
</style>
</head>
<body>
 
<div class= "v_men">
    <span > Город:  </span>
    <div id= "v_men" class= " men_reg down">
        <select name="reg1">
            <option name="reg1" value="0" > Москва  </option>
            <option name="reg1" value="1" > С-Петербург </option>
            <option name="reg1" value="1" > Кишинев </option>
        </select>
    </div>
</div>
 
<script>
document.querySelector("#v_men").addEventListener('click', vMen_open, true);   
 
function vMen_open (e) {
    let rec = document.querySelector('#v_men').classList;
    if (rec.contains('down')) {
        rec.remove("down");
        rec.add("up");
        document.querySelector("#v_men").removeEventListener('click', vMen_open);
        setTimeout(_ => document.addEventListener('click', vMen_clos));  
    } else {
        vMen_clos(e)
    }
}
 
function vMen_clos(e)  {
    let rec = document.querySelector('#v_men');
    rec.classList.remove("up");
    rec.classList.add("down");  
    document.removeEventListener('click', vMen_clos);   
}
</script>
</body>
</html>


Добавлено через 35 минут
Или вообще вот так...

Кликните здесь для просмотра всего текста
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<style>
.v_men {
  display: inline;  
  width: 250px;
  margin-left: 10px;
}
 
.men_reg    {
    position: absolute;
}
 
.men_reg select {
    width: 200px;
    height: 35px;
    padding: 2px 10px;
    border: none;
    outline: none;
  color: yellow;
  background-color: black;
  font-size: 18px;
}
 
.men_reg::before {
    width: 50px;
    height: 50px;
    position: relative;
    top: 1px;
    right: -200px;
 
    text-align: center;
    line-height: 50px;
    font-size: 28px;
    color: #fff;
    pointer-events: none;
    content: "▽";     
    background-color: magenta;
}
.men_reg:hover::before  {
    background-color: yellow;
}
 
.up::before {
    content: "△";
    background-color: blue;
}
</style>
</head>
<body>
 
<div class= "v_men">
    <span > Город:  </span>
    <div id= "v_men" class= " men_reg down">
        <select name="reg1">
            <option name="reg1" value="0" > Москва  </option>
            <option name="reg1" value="1" > С-Петербург </option>
            <option name="reg1" value="1" > Кишинев </option>
        </select>
    </div>
</div>
 
<script>
document.querySelector("#v_men").addEventListener('click', vMen_open, true);   
 
function vMen_open (e) {
    let rec = document.querySelector('#v_men').classList;
    if (rec.contains('up')) {
        vMen_clos(e)
    } else {
        setTimeout(_ => document.addEventListener('click', vMen_clos));  
        rec.toggle("up");
    }
}
function vMen_clos(e)  {
    let rec = document.querySelector('#v_men').classList;
    rec.toggle("up");
    document.removeEventListener('click', vMen_clos);   
}
</script>
</body>
</html>
1
1 / 1 / 0
Регистрация: 08.03.2019
Сообщений: 141
16.12.2024, 16:46  [ТС]
krvsa, спасибо большое.

Все хорошо, кроме вроде бы одного маленького но: Esc - окно закрывается, но стрелка - увы... Попытался исправить сам, но с ходу не получилось - по Esc событие для документа похоже не происходит:

JavaScript
1
2
3
4
5
6
7
8
9
 document.addEventListener('keydown', get_key_doc);
 
function get_key_doc (e) {
 
 if (e.keyCode == 27)   {   // Enter
    vMen_clos(e);
    document.removeEventListener('keydown', get_key);
 }
}
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3819 / 1657 / 428
Регистрация: 14.03.2022
Сообщений: 4,133
16.12.2024, 16:53
Цитата Сообщение от dav60 Посмотреть сообщение
по Esc событие для документа похоже не происходит
Разумеется.
Тут нужно смотреть событие клавиатуры. Ведь после Esc, можно еще нажать Enter...
0
1 / 1 / 0
Регистрация: 08.03.2019
Сообщений: 141
16.12.2024, 17:07  [ТС]
... Второй вариант получился также интересным, но и у него, увы, также Esc не работал.

Цитата Сообщение от krvsa Посмотреть сообщение
Тут нужно смотреть событие клавиатуры. Ведь после Esc, можно еще нажать Enter...
Конечно, но о Return не стал упоминать, потому что, по Ret окно закрывалась и стрелка возвращалась в исходное положение - видимо, уже сам Select их по разному обрабатывает.

Как написал ранее, обработчик поставил, и он срабатывает (если посмотрите) до раскрытия списка, а при закрытии уже не срабатывает - такое впечатление, что его пер6ехватывает select и блокирует дальнейшее распространение

Ps.
А без Esc - ... надо уже искать решение для него.
Хотя и мой предварительный вариант также оказался нерабочим - думал, что обработку событий клавиатуры потом легко добавлю.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3819 / 1657 / 428
Регистрация: 14.03.2022
Сообщений: 4,133
16.12.2024, 17:24
dav60, селект вообще "капризный" элемент ДОМ...
0
1 / 1 / 0
Регистрация: 08.03.2019
Сообщений: 141
16.12.2024, 17:35  [ТС]
А не стоит ли и не проще ли будет в таком случае написать собственный код выпадающего списка ?
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3819 / 1657 / 428
Регистрация: 14.03.2022
Сообщений: 4,133
16.12.2024, 19:05
Лучший ответ Сообщение было отмечено dav60 как решение

Решение

dav60, могу с уверенностью сказать:
- Так все и поступают...
1
1 / 1 / 0
Регистрация: 08.03.2019
Сообщений: 141
16.12.2024, 19:35  [ТС]
krvsa, спасибо огромное.

Для большого списка, особенно когда список не помещается на экране и требуется листание, так и поступил.
А вот при небольшом количестве, скажем до 5-10 строк(элементов) были сомнения: стоит ли писать что-то свое, по крайней мере на первом этапе, когда вроде бы стандартный вариант вполне отвечал требованиям - реагировал на все основные клавиши. оставался только только значок признака открыто/закрыто меню. И не видел никаких аргументов в пользу самописного кода кроме него (а насколько он важен, кажется с ним солиднее, но если и так, то непонятно - насколько )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.12.2024, 19:35
Помогаю со студенческими работами здесь

Преобразование кода без указателя в код с использованием указателя
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;fstream&gt; using...

Сделать кнопку для выпадающего меню
Добрый день. Хочу сделать кнопку выподающего меню как на сайте (https://www.miamamia.de/). Кнопка появляется на сайте при ширине экрана...

Нужен совет по css для выпадающего меню
Структура меню &lt;ul class=&quot;nice-menu1&quot;&gt; &lt;li&gt;&lt;a...&lt;/li&gt; &lt;li&gt;&lt;a...&lt;/li&gt; &lt;li&gt; &lt;a...&gt; &lt;ul class=&quot;nice1&quot;&gt; ...

JavaScript для выбора пункта выпадающего меню
Приветствую. Я абсолютный профан в данной теме, поэтому прошу помощи тут, грубо говоря, прошу все сделать за меня. Предыстория В...

Задать время задержки для выпадающего меню
Нужна помощь. Сразу после отвода курсора от гиперссылки выпадающее меню пропадает. Как можно справиться с этой проблемой? Пыталась сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru