Почему добавление анимации ключевых кадров к элементу с помощью AddClass запускает всю функцию> В Javascript?
Ответ на этот вопрос определяется структурой кода.
Во-первыхНа всякий случай, если кто-то не уверен, добавление анимации ключевых кадров CSS к API или блоку кода по сути не вызывает повторного запуска функции JavaScript.Хотя он может быть спроектирован так, чтобы делать это [в сочетании с дополнительным кодом], если это желательно, его органический дизайн не предназначен для таких целей.В этом конкретном случае, когда добавление CSS-анимации через добавление класса, по-видимому, вызывает ее собственную функцию, сама анимация не вызывает функцию [или имитирует вызов функции], а скорее это неожиданное поведение является результатом неполного кода.
Ошибка кода
Наблюдая за кодом в действии, мы можем легко увидеть непреднамеренное поведение, которое приводит к срабатыванию различных блоков кода, когда этого не требуется.После дальнейшей проверки экзаменаторы отметят конкретный блок кода, связанный с этим поведением.Если мы сосредоточимся на этом блоке кода, мы обнаружим, что EventListener был включен, но никогда не выключался (в чистом виде JS он был добавлен, но никогда не удалялся).Вот в чем проблема.Поскольку EventListener никогда не был выключен, он все еще ожидает завершения анимации.Когда к прослушиваемому элементу добавляются дополнительные анимации (через класс или любой другой метод), EventListener запускается так, как должен, и запускается обработчик, реализуя любой код, который ему дан для запуска.Это приводит к странному поведению, которое вызывает функцию.
Решение
Как только код проблемы найден, решение становится очевидным.Просто отключите EventListener в соответствующем месте (несколько вариантов), и приложение будет работать без нареканий.
Рекомендуемый пример кода
else { /* Try code below */
// $('.show').off('animationend')
console.log(`All slides displayed', 'image index is: ${imgnx}`);
$(".slides").removeClass("show").addClass("hide");
/* Try code here */
// $('.show').off('animationend')
$(".hide").last().on('animationend', function () {
$(".slides").remove(); imgnx = 0; fadeImg();
$('#ctnr').fadeOut('slow').fadeIn('slow')
})
Заключение
Да, существуют различные обходные путии т. д., но обычно гораздо лучше поддерживать надлежащие стандарты программирования и реализовывать полный и правильный код, чем обходить неполный или неправильный код.Кроме того, включенные предложения по коду являются лишь примерами и ни в коем случае не являются возможными решениями.Немного больше взаимодействия кода и безграничных решений обязательно придет.
Но, что более важно, это упражнение служит для демонстрации ценности удаления или отключения EventListener.
Спасибо.