Общеклассовое событие не работает

Я создаю сетку divs 16x16 в JavaScript. Каждый div имеет событие mouse enter (унаследованное на основе общий класс), которое должно изменить его фон чернить на белый.

Вот моя проблема:, в то время как каждый div должен менять цвет при наведении курсора, все divs (при наведении курсора) вызывают изменение цвета одного и того же нижнего правого div, а не сами по себе.


Я считаю, что все события ссылаются на последний div под className "squares" (нижний правый div). Как сделать так, чтобы каждое событие ссылалось на свой собственный div?

СНИМОКОбщеклассовое событие не работает

КОД

    //GRID CREATION (30x30)
    var container = document.getElementById('container');
    var size = 30;

    //Row Creation (30)
    for(j=0; j < size; j++) {
        var row = document.createElement('div');
        row.classList.add("row");

        //Square Creation (30 per Row)
        for(i=0; i<size; i++) {
            var square = document.createElement('div')
            square.classList.add("square");

            //div background-color changes on mouse-enter   
            square.addEventListener('mouseenter', () => { 
                this.square.style.background = 'white';
            });

            row.appendChild(square);
        }
        container.append(row);
    }

Что такое this.square?

Ry- 06.04.2018 02:51

Вам нужно создать замыкание, потому что this применяется к последней итерации цикла. Создайте функцию, передайте this и измените там фон

Sterling Archer 06.04.2018 02:51

@SterlingArcher: this одинаков для всех итераций цикла, хотя

Ry- 06.04.2018 02:51

@ Ry︁ правильно, но если предположить, что this является ссылкой на класс, даже если this удаляется, не будет ли он привязан за пределами цикла?

Sterling Archer 06.04.2018 02:53

@Ry @SterlingArcher Изначально у меня не было this, и существовала та же проблема: все события затрагивали только нижний правый div

Ben 06.04.2018 02:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Странно найти this.square в прослушивателе событий, когда ничто другое не относится к this.square. Возможно, вы изначально пробовали square.style.background, который не работал по причине, описанной в Замыкание внутри цикла в JavaScript - простой практический пример, затем пытались исправить это с помощью this.style.background = 'white';, который не работал, потому что это была стрелочная функция, а затем пытались заставить this.square работать…?

В любом случае, используйте функцию без стрелки, чтобы получить this внутри как элемент, к которому был прикреплен прослушиватель событий, вместо того же, что и this снаружи:

square.addEventListener('mouseenter', function () { 
    this.style.background = 'white';
});

или лучше объявите свои переменные с помощью let - который должен быть доступен, поскольку вы использовали стрелочную функцию - и обратитесь к square:

//GRID CREATION (30x30)
let container = document.getElementById('container');
let size = 30;

//Row Creation (30)
for (let j = 0; j < size; j++) {
    let row = document.createElement('div');
    row.classList.add("row");

    //Square Creation (30 per Row)
    for (let i = 0; i < size; i++) {
        let square = document.createElement('div');
        square.classList.add("square");

        //div background-color changes on mouse-enter   
        square.addEventListener('mouseenter', () => { 
            square.style.background = 'white';
        });

        row.appendChild(square);
    }
    container.append(row);
}

Также отсутствовали декларации для j и i. Вы должны включить строгий режим и никогда не использовать var, чтобы избежать подобных проблем.

Другие вопросы по теме