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

EventListener вызывает функцию, когда событие не происходило

22.12.2021, 22:08. Показов 699. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, вот в чём суть:
Есть множество кнопок (по умолчанию спрятаны, появляются при наведении мыши на картинку). То есть имеется div, содержащий три контейнера, в каждом из которых находится картинка и кнопка под ней.
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 <div class="categories">
                <div class="item_wrapper" name="coat1">
                    <img class = "categories_row_item" src="img/coat1.png" alt="coat">
                    <button class="button-buy" type="button">ДЕТАЛІ</button>
                </div>
                <div class="item_wrapper">
                    <img class = "categories_row_item" src="img/coat2.png" alt="coat">
                    <button class="button-buy">ДЕТАЛІ</button>
                </div>
                <div class="item_wrapper">
                    <img class = "categories_row_item" src="img/coat3.jpeg" alt="coat">
                    <button class="button-buy">ДЕТАЛІ</button>
                </div>
            </div>
Так же в body находится спрятанное всплывающее окно
HTML5
1
<div id="popup_window"></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
.categories{
    display: flex;
    flex-direction: row;
    flex-shrink: 1;
    width: 1000px;
}
.item_wrapper{
    position: relative;
    display: flex;
    flex-shrink: 1;
    flex-wrap: wrap;
    width: 300px;
    height: 300px;
    margin: 10px auto 10px auto;
}
.categories_row_item{
    position: absolute;
    display: flex;
    flex-shrink: 1;
    flex-wrap: wrap;
    width: 300px;
    height: 300px;
}
.button-buy{
    position: absolute;
    font-size: 20px;
    font-weight: bold;
    background: #FF9930;
    color: white;
    display: block;
    top: 250px;
    margin-bottom: 0;
    width: 300px;
    height: 50px;
    opacity: 100;
    z-index: 2;
    opacity: 0;
    cursor: pointer;
}
#popup_window{
    display: flex;
    width: 100%;
    height: 100%;
    position: fixed;
    background: #FF9930;
    opacity: 0%;
}
В JS пытаюсь обработать нажатие на каждую кнопку, чтобы всплывало popup_window.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
window.onload=function(){
  var cat_item1 = document.getElementsByClassName("item_wrapper");
  
  for(var i = 0; i < cat_item1.length; i++){
    cat_item1[i].lastElementChild.addEventListener("click", showPopUp(cat_item1[i]));
    console.log(cat_item1[i].lastElementChild)        //Вывожу для проверки, выводит все объекты button, как и надо
  }
}
 
function showPopUp(e){
  var pw = document.getElementById("popup_window");
  pw.innerHTML=e.getAttribute("name");        //Выводит имя последней кнопки на странице
  pw.style.opacity="100%";
}
И в итоге последняя функция выполняется в любом случае, без нажатий на кнопку. Уже всё перепробовал, в чём может быть проблема?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.12.2021, 22:08
Ответы с готовыми решениями:

Как сделать чтобы событие происходило пока кнопка нажата и заканчивалось, когда отпустили?
Добрый вечер, вопрос касательно Button, как сделать чтобы событие происходило пока кнопка нажата и заканчивалось, когда отпустили? Заранее...

Treeview: нужно чтобы событие происходило если выбрана ветвь а не узел
Всем привет, возник вопрос, есть ли в treeview event по типу AfterSelect, только для ветви, мне нужно чтобы событие происходило если...

Как сделать так, чтобы событие происходило при нажатии на родительский элемент?
у меня есть секция .facilities и внутри есть блок .facilities-block внутри которого находятся еще два блока - .sidebar и .picture. В...

2
 Аватар для klyapa
3503 / 1267 / 429
Регистрация: 24.07.2016
Сообщений: 1,890
22.12.2021, 23:33
Лучший ответ Сообщение было отмечено romcheg как решение

Решение

Что вы передаёте в обработчик таким образом?
JavaScript
1
cat_item1[i].lastElementChild.addEventListener("click", showPopUp(cat_item1[i]));
Попробуйте так
JavaScript
1
2
3
4
5
6
7
function showPopUp(elem){
    return function(e) {
        var pw = document.getElementById("popup_window");
        pw.innerHTML = elem.getAttribute("name");
        pw.style.opacity = "100%";
    }
}
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
23.12.2021, 02:48
romcheg, вы постоянно выполняли обработчик клика кнопки во время навешивания обработчика на кнопку.
Правильно навешивать обработчик так:
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
93
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <style>
        .categories {
            display: flex;
            flex-direction: row;
            flex-shrink: 1;
            width: 1000px;
        }
 
        .item_wrapper {
            position: relative;
            display: flex;
            flex-shrink: 1;
            flex-wrap: wrap;
            width: 300px;
            height: 300px;
            margin: 10px auto 10px auto;
        }
 
        .categories_row_item {
            position: absolute;
            display: flex;
            flex-shrink: 1;
            flex-wrap: wrap;
            width: 300px;
            height: 300px;
        }
 
        .button-buy {
            position: absolute;
            font-size: 20px;
            font-weight: bold;
            background: #FF9930;
            color: white;
            display: block;
            top: 250px;
            margin-bottom: 0;
            width: 300px;
            height: 50px;
            /* opacity: 100; */
            z-index: 2;
            /* opacity: 0; */
            cursor: pointer;
        }
 
        #popup_window {
            display: flex;
            width: 100%;
            height: 100%;
            position: fixed;
            background: #FF9930;
            opacity: 0%;
        }
    </style>
</head>
 
<body>
    <div class="categories">
        <div class="item_wrapper" name="coat1">
            <img class="categories_row_item" src="img/coat1.png" alt="coat">
            <button class="button-buy" type="button">ДЕТАЛІ</button>
        </div>
        <div class="item_wrapper" name="coat2">
            <img class="categories_row_item" src="img/coat2.png" alt="coat">
            <button class="button-buy" type="button">ДЕТАЛІ</button>
        </div>
        <div class="item_wrapper" name="coat3">
            <img class="categories_row_item" src="img/coat3.jpeg" alt="coat">
            <button class="button-buy" type="button">ДЕТАЛІ</button>
        </div>
    </div>
    <div id="popup_window"></div>
    <script>
        window.onload = function () {
            var cat_item1 = document.getElementsByClassName("item_wrapper");
 
            for (var i = 0; i < cat_item1.length; i++) {
                cat_item1[i].lastElementChild.addEventListener("click", buttonBuy_click);
                console.log(cat_item1[i].lastElementChild)        //Вывожу для проверки, выводит все объекты button, как и надо
            }
        }
 
        function buttonBuy_click(event) {
            var pw = document.getElementById("popup_window");
            pw.innerHTML = this.parentElement.getAttribute("name");        //Выводит имя этой кнопки 
            pw.style.opacity = "100%";
        }
    </script>
</body>
</html>
Обработчику здорово помогает ключевое слово this. Это тот HTML-элемент, на который навешен обработчик.
Соответственно parentElement будет его wrapper.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.12.2021, 02:48
Помогаю со студенческими работами здесь

Как сделать, чтобы при прокрутке странички вверх происходило событие изменения класса?
Подскажите как сделать, что бы при прокрутке странички вверх происходило событие изменения класса, а если снова вниз крутить оно...

Что вызывает событие BeforeUpdate
Добрый день! Хотел бы посоветоваться из специалистами по такому вопросу: Есть у меня форма Квартира. В ней подчиненная табличная...

Очень нужно, чтобы при нажатии кнопки back (назад)броузера , когда я нахожусь на второй странице, происходило обновление предыдущей
Есть первая страница с формой,в которой есть текстовые поля и кнопка submit.При нажатии этой кнопки откравается вторая страница с передачей...

Calendar Control не вызывает событие SelectionChanged
Calendar Control не вызывает событие SelectionChanged, как будто не происходит postback в чем может быть проблема?

Вызывает toArray(), когда его нет
Привет, может кто подсказать почему появляется эта ошибка ) ::error file=tests/Tzp/Rest/TzpPressformRestTest.php,line=15::Error: Call...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru