Несколько причин, по которым метод removeEventListener() может не удалять ранее зарегистрированный обработчик:
- Не совпадают опции. 1 Браузер сравнивает опции, когда ищет обработчик события для удаления. 1 Если в addEventListener() передали в опциях true, а в removeEventListener() нет опций, то обработчик не удалится. 1 Это происходит потому, что третий аргумент неявно устанавливается в undefined, а undefined превращается в false при конвертации в булев тип. 1
- Ранее использовалась анонимная функция. 1 Функции относятся к ссылочным типам данных, поэтому две одинаково написанные функции будут считаться различными. 1 Если ранее в addEventListener() использовалась анонимная функция, то убрать обработчик с помощью removeEventListener() не получится. 1
- Обработчик был зарегистрирован в виде функции выражения. 3 В таком случае его нельзя удалить. 3
Чтобы избежать проблем, рекомендуется повторять в точности те же параметры, которые использовались в addEventListener(), чтобы браузер точно знал, какой обработчик нужно удалить. 1