Как правильно переопределить обработчики событий DOM?

Если я создал кнопку и прикрепил обработчик кликов:

let btn = document.createElement("button");
btn.innerHTML = "Do Something";
btn.onclick = () => { doSomething(); };
document.body.appendChild(btn);

А позже я хочу повторно использовать кнопку для чего-то другого, это безопасный способ переопределить обработчик событий?

btn.innerHTML = "Do Something Else";
btn.onclick = () => { doSomethingElse(); }

Я видел несколько примеров, которые устанавливают btn.onclick = null; перед присоединением нового обработчика. Также несколько примеров с addEventListener() / removeEventListener(). Есть ли разница между этими методами? Могу ли я вводить утечки памяти с любым из них?

все должно быть в порядке, если вы переопределите обратный вызов слушателя, возможно, они установят его равным нулю или удалит его, чтобы отключить событие, связанное с кнопкой

Sudhanshu Kumar 25.12.2020 06:46
Поведение ключевого слова "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) для оценки ваших знаний,...
1
1
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Чтобы разрешить установку нескольких обработчиков для одного и того же события на данном объекте, вы можете вызвать его метод addEventListener(), который управляет списком обработчиков для данного события на объекте. Затем обработчик можно удалить из объекта, вызвав его функцию removeEventListener().

После удаления предыдущего обработчика событий вы можете снова прикрепить новый обработчик event к тому же элементу. Таким образом, не будет никаких утечек памяти.

Демонстрация кода:

let btn = document.createElement("button");
btn.innerHTML = "Do Something";
element.addEventListener("click", doSomething, true)
document.body.appendChild(btn);

           ...
btn.removeEventListener("click", doSomething, true);  

// Третий аргумент должен быть таким же, как в предыдущем случае. правда в этом случае.

btn.addEventListener("click",doSomethingThingElse};

Спасибо! Вызывает ли btn.onclick = ... утечку памяти?

wololoo 25.12.2020 07:01

Лично я чувствую, что это будет причиной. Поскольку наш обработчик остается там, а просто ссылка устанавливается в нулевое значение. Но я не уверен на 100%, приятель :) Если мой ответ вам хоть как-то помог. Проголосуйте и примите ответ, чтобы другие разработчики могли извлечь выгоду :) Спасибо.

Imran Rafiq Rather 25.12.2020 07:04

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

wololoo 25.12.2020 07:16

Я! Но мы не контролируем сборку мусора сами. Это автоматический процесс. Вот что такое утечка памяти. Сбор мусора может произойти, а может и не произойти немедленно. :)

Imran Rafiq Rather 25.12.2020 07:19

О, я в порядке с некоторой задержкой. Я просто хочу убедиться, что я не создаю вещи, которые останутся в памяти на неопределенный срок. Хорошая мысль.

wololoo 25.12.2020 07:20

Отпустите, когда память больше не нужна: на этом этапе возникает большинство проблем с управлением памятью. Самый сложный аспект этого этапа — определить, когда выделенная память больше не нужна. developer.mozilla.org/en-US/docs/Web/JavaScript/…

Imran Rafiq Rather 25.12.2020 07:21

В приведенном выше комментарии я делюсь с вами некоторой ценной информацией :) О проблеме с утечками памяти :) И почему мы не уверены, когда сборка мусора начнет действовать. Просто нажмите на ссылку и получите больше знаний! Бог благословил

Imran Rafiq Rather 25.12.2020 07:23

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