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

Открытие попап окна при нажатии на пункт меню

27.05.2025, 18:23. Показов 1134. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть код который при нажатии на кнопку открывает попап окно. Мне нужно еще чтобы такое же попап окно открывалось при нажатии на определенный пункт меню, но дело в том что как только я назначила класс openDialogBtn пункту меню попап окно уже не открывается при нажатии на кнопку, то есть почему можно сделать либо на кнопку либо только на пункт меню.
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<body class="parent ">
  <button
    class="openDialogBtn button-violet"
    type="button"
    aria-haspopup="dialog"
    aria-controls="myDialog"
  >
    Примеры работ
  </button>
  <dialog class="child" id="myDialog">
    <div class="dialog__wrapper">
        <div class="icons">
            <a class="icon" href="https://rutube.ru/channel/48172946/"><img  src="https://antiugon161.ru/wp-content/uploads/2025/05/rutub.png" > </a>
            <a class="icon" href="https://m.vkvideo.ru/@id888935889"><img  src="https://antiugon161.ru/wp-content/uploads/2025/05/вк1.png" > </a>
            <a class="icon" href="https://youtube.com/@protectorrostov?si=DevGLs5nWOyiH7j8"><img src="https://antiugon161.ru/wp-content/uploads/2025/05/ютюб1.png" > </a>
            
        </div>
    </div>
  </dialog>
</body>
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
26
27
28
29
30
31
32
33
34
35
36
37
38
<script>
            const dialog = document.getElementById('myDialog')
const dialogOpener = document.querySelector('.openDialogBtn')
const dialogCloser = dialog.querySelector('.closeDialogBtn')
 
function closeOnBackDropClick({ currentTarget, target }) {
  const dialog = currentTarget
  const isClickedOnBackDrop = target === dialog
  if (isClickedOnBackDrop) {
    close()
  }
}
 
function openModalAndLockScroll() {
  dialog.showModal()
  document.body.classList.add('scroll-lock')
}
 
function returnScroll() {
  document.body.classList.remove('scroll-lock')
}
 
function close() {
  dialog.close()
  returnScroll()
}
 
dialog.addEventListener('click', closeOnBackDropClick)
dialog.addEventListener('cancel', (event) => {
  returnScroll()
});
dialogOpener.addEventListener('click', openModalAndLockScroll)
dialogCloser.addEventListener('click', (event) => {
  event.stopPropagation()
  close()
})
 
</script>
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
dialog {
  
  height: 190px;
  width: 550px;
 
 justify-content:center;
    text-align:center;
  border: none;
  padding: 0;
  background-color: #FFFFFF;
  color: #000000;
 
}
 
.dialog__wrapper {
  padding: 1em;
 
}
 
dialog::backdrop {
  background-color: rgb(0 0 0 / 0.8);
}
 
.scroll-lock {
  overflow: hidden;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2025, 18:23
Ответы с готовыми решениями:

Страницу скроллит наверх при нажатии на попап от чата битрикса24?
Есть сайт - https://eco-drev.by/. На нем подключен чат от битрикса, в котором используется...

Как создать меню так, чтобы при нажатии на пункт в этом самом меню в окне появилась информация?
Здравствуйте! Я только начал изучать JavaScript и работаю в программе IntelliJ IDEA Community...

Открытие попап там, откуда он был вызван
Доброе утро! проблема с открытием попап под той ссылкой, откуда попап был вызван. сейчас он...

5
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3942 / 2046 / 829
Регистрация: 13.03.2010
Сообщений: 6,738
27.05.2025, 18:29
Цитата Сообщение от DoctorNifario Посмотреть сообщение
JavaScript
3
const dialogOpener = document.querySelector('.openDialogBtn')
Вы берёте первую кнопку. Обрабатывайте все нужные кнопки циклом.
0
 Аватар для voraa
1234 / 1126 / 175
Регистрация: 21.01.2024
Сообщений: 5,128
27.05.2025, 19:41
А почему вы код не весь приводите.
Где меню с пунктами, где элемент закрытия диалога .closeDialogBtn?
0
0 / 0 / 0
Регистрация: 17.05.2022
Сообщений: 26
28.05.2025, 11:36  [ТС]
не выходит
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3806 / 1643 / 428
Регистрация: 14.03.2022
Сообщений: 4,087
28.05.2025, 12:34
Цитата Сообщение от DoctorNifario Посмотреть сообщение
не выходит
Что именно?
Вот принципиальный пример как такое можно реализовать...

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
<button>Кнопка</button>
<a href='#'>Ссылка</a>
 
<script>
document.querySelectorAll('button, a').forEach(o => o.addEventListener('click', act))
//
function act(e){
    e.preventDefault()
    const v = this.tagName === 'A' ? 'Ссылка': 'Кнопка'
    alert(v)
}
</script>
0
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
28.05.2025, 20:21
Цитата Сообщение от DoctorNifario Посмотреть сообщение
как только я назначила класс openDialogBtn пункту меню попап окно уже не открывается при нажатии на кнопку
Потому, что отсутствует функция showModal. (Которая, вероятно, открывает окно).
Цитата Сообщение от DoctorNifario Посмотреть сообщение
нужно еще чтобы такое же попап окно открывалось при нажатии на определенный пункт меню
Дело в том, что пункты меню у вас заданы при помощи ссылок - тегов <a>. Эти теги имеют по умолчанию функцию - при клике по ним открыть новую вебстраницу, URL которой задан при помощи соответствующего атрибута href. Поэтому при клике на пункт меню (т.е. на ссылку) у вас будет происходить переход на соответствующую страницу с другим URL, например, на https://rutube.ru/channel/48172946/ .
Если вы хотите, чтобы по клику по пункту меню открывалось окно на этой же странице, т.е. чтобы не происходило перехода на страницу с другим URL, можно поступить двумя путями.
1. Использовать другой тег вместо <a>. Например, тег <div> или <span>.
2. Отключить указанную (по умолчанию) функциональность для ссылок. Это, опять же, можно сделать двумя путями. В обоих случаях следует добавить функцию вызова всплывающего окна. Я сделал простейшую - на примере обычного alert.

Далее - два способа:
2.1. На примере 3-й ссылки (пункта меню):
HTML5
1
<a class="icon clickable" href="https://youtube.com/@protectorrostov?si=DevGLs5nWOyiH7j8" onclick="click_worker(this); return false"><img src="https://antiugon161.ru/wp-content/uploads/2025/05/ютюб1.png" > </a>
JavaScript
1
2
3
function click_worker(x) {
        alert('Произведен клик мышью по тегу:\n'+ x.outerHTML)
    }
Здесь return false используется для отключения указанной функциональности, назначенной тегу <a> по умолчанию.
2.2.
HTML5
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
<body class="parent ">
<button
        class="openDialogBtn button-violet clickable"
        type="button"
        aria-haspopup="dialog"
        aria-controls="myDialog"
>
    Примеры работ
</button>
<dialog class="child" id="myDialog">
    <div class="dialog__wrapper">
        <div class="icons clickable">
            <a class="icon" href="https://rutube.ru/channel/48172946/"><img  src="https://antiugon161.ru/wp-content/uploads/2025/05/rutub.png" > </a>
            <a class="icon" href="https://m.vkvideo.ru/@id888935889" ><img  src="https://antiugon161.ru/wp-content/uploads/2025/05/вк1.png" > </a>
            <a class="icon" href="https://youtube.com/@protectorrostov?si=DevGLs5nWOyiH7j8" ><img src="https://antiugon161.ru/wp-content/uploads/2025/05/ютюб1.png" > </a>
 
        </div>
    </div>
</dialog>
 
<script>
    var clickable = document.getElementsByClassName('clickable');
    for(var j = 0; j<clickable.length; j++){
        clickable[j].onclick = function (e) {
            e.preventDefault(); // Отменяем функциональность тега, заданную браузером по умолчнаию
            if(e.target.tagName.toLowerCase() === 'div'){ // Прекращаем обрабатывать клик, если он был сделан по тегу-родителю пунктов меню
                return;
            }
            alert('Произведен клик мышью по тегу:\n'+ e.target.outerHTML)
        }
    }
 
 
    const dialog = document.getElementById('myDialog')
    const dialogOpener = document.querySelector('.openDialogBtn')
    const dialogCloser = dialog.querySelector('.closeDialogBtn')
 
    function closeOnBackDropClick( currentTarget, target ) {
        const dialog = currentTarget
        const isClickedOnBackDrop = target === dialog
        if (isClickedOnBackDrop) {
            close()
        }
    }
 
    function openModalAndLockScroll() {
        dialog.showModal()
        document.body.classList.add('scroll-lock')
    }
 
    function returnScroll() {
        document.body.classList.remove('scroll-lock')
    }
 
    function close() {
        dialog.close()
        returnScroll()
    }
 
//    dialog.addEventListener('click', closeOnBackDropClick)
    dialog.addEventListener('cancel', (event) => {
        returnScroll()
    });
//    dialogOpener.addEventListener('click', openModalAndLockScroll)
    dialogCloser.addEventListener('click', (event) => {
        event.stopPropagation()
    close()
    })
 
</script>
 
 
 
 
 
</body>
Добавлено через 12 минут
Для кроссбраузерности лучше бы добавить строчку:
JavaScript
1
e = e ? e : window.event;
Вместо e.target написать:
JavaScript
1
(e.target || e.srcElement)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.05.2025, 20:21
Помогаю со студенческими работами здесь

Как передать из попап окна родителю переменную?
Привет знатокам JavaScript ! Что- то не получается передать переменную в родительское окно,...

Не получается прописать скрипты для создания попап окна в тильде
Добрый день! Помогите, пожалуйста, прописать корректный код для показа зеро блока с &quot;колесом...

Попап окно при клике по ссылке
Добрый день. Никак не могу вывести попап окно при клике по ссылке. Кто может набросать код? ...

Попап при выходе
Всем привет. Появилась надобность выводить попап при закрытии страницы. В сети есть подобные...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru