Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.01.2021, 14:37
Новичок на форуме
Отправить личное сообщение для VladislavK_ Посмотреть профиль Найти все сообщения от VladislavK_
 
Регистрация: 15.01.2021
Сообщений: 3

Удаление прослушивания события
Здравствуйте, столкнулся с такой проблемой.
Я понимаю, что через removeEventListener можно удалить события, который мы установили через addEventListener.
Но там же есть нюанс, что туда мы передаём функцию:
Ну то есть, если бы писали так:
cell.addEventListener(‘click’, someFunc)
......
cell.removeEventListener(‘click’, someFunc)
Тогда да, оно бы сработало.

Но если будет анонимная функция, то мы не сможем удалить(например)
cell.addEventListener(‘click’, ()=> console.log(‘hello world’))
......
cell.removeEventListener(‘click’, ....?) // тут уже без вариантов

———————————-

Но как поступить, если в ту функцию, которую мы должны выполнять при триггере события, нам нужно передать ещё параметр

Ну то есть:
cell.addEventListener(‘click’, func(param))
Так не сработает(просто сразу же выполнится)

Можно например сделать так:
cell.addEventListener(‘click’, () => func(param)) чтобы переедать параметр
Но как в таком случае нет возможности удалить прослушивание.


Может есть какой-то способ, чтобы я мог и передавать параметры в функцию колбэка
Но и потом смог удалить прослушивание этого события.
Ответить с цитированием
  #2 (permalink)  
Старый 15.01.2021, 15:18
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

let param = ...

function somFunc (ev) { handler.call(this, ev, param)}

cell.addEventListener(‘click’, someFunc)
......
cell.removeEventListener(‘click’, someFunc)

Последний раз редактировалось voraa, 15.01.2021 в 15:28.
Ответить с цитированием
  #3 (permalink)  
Старый 15.01.2021, 16:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

VladislavK_,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #4 (permalink)  
Старый 15.01.2021, 16:05
Новичок на форуме
Отправить личное сообщение для VladislavK_ Посмотреть профиль Найти все сообщения от VladislavK_
 
Регистрация: 15.01.2021
Сообщений: 3

private setEvent(): void {
  const cellClick = (cell: Cell) => {
    if (this.occupiedCells.has(cell)) {
      console.log('DESTROY');
    } else {
      console.log('empty');
    }
  };

  this.engine.on(this.shovelNode, 'click', (e) => {
    this.toggleState();
    this.engine.events.click.eventBubbling = !!this.isActive;
    if (this.isActive) {
      this.cells.forEach((cellRow) => cellRow.forEach((cell) => {
        this.engine.on(cell.node, 'click', () => cellClick(cell));
      }));
    } else {
       this.cells.forEach((cellRow) => cellRow.forEach((cell) => {
          this.engine.off(cell.node, 'click', () => cellClick(cell));
        }));
    }
  });
}

this.engine.on и this.engine.off то же самое, что и addEventListener, removeEventListener
this.cells - двумерный массив (игровое поле)
то есть мне надо поставить событие на каждую клетку поля(узел cell в canvas)
но если я сделаю неактиный узел shovel, то тогда удалить все прослушивания

И я точно не уверен, сработает ли такой вариант
с учетом того, что параметры переадаются разные
Ответить с цитированием
  #5 (permalink)  
Старый 15.01.2021, 16:45
Новичок на форуме
Отправить личное сообщение для VladislavK_ Посмотреть профиль Найти все сообщения от VladislavK_
 
Регистрация: 15.01.2021
Сообщений: 3

Сообщение от voraa Посмотреть сообщение
let param = ...

function somFunc (ev) { handler.call(this, ev, param)}

cell.addEventListener(‘click’, someFunc)
......
cell.removeEventListener(‘click’, someFunc)
Чуть-чуть пришлось поменять и всё заработало, спасибо большое!)
Ответить с цитированием
  #6 (permalink)  
Старый 15.01.2021, 16:57
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Попробуйте рассмотреть такой вариант.
Если к каждой ячейке cell добавить еще поле clickHandler, сильно хуже ей не станет
private setEvent(): void {
  const cellClick = (cell: Cell) => {
    if (this.occupiedCells.has(cell)) {
      console.log('DESTROY');
    } else {
      console.log('empty');
    }
  };
 
  this.engine.on(this.shovelNode, 'click', (e) => {
    this.toggleState();
    this.engine.events.click.eventBubbling = !!this.isActive;
    if (this.isActive) {
      this.cells.forEach((cellRow) => cellRow.forEach((cell) => {
	    cell.clickHandler = () => cellClick(cell)
        this.engine.on(cell.node, 'click', cell.clickHandler);
      }));
    } else {
       this.cells.forEach((cellRow) => cellRow.forEach((cell) => {
          this.engine.off(cell.node, 'click', cell.clickHandler);
        }));
    }
  });
}


Я, конечно не совсем представляю, что такое на самом деле
this.engine.on(cell.node, 'click', () => cellClick(cell));
Но если это просто
cell.node.addEventListener(‘click’, () => cellClick(cell))

то можно просто
cell.node.onclick = () => cellClick(cell)
и
cell.node.onclick = null

Последний раз редактировалось voraa, 15.01.2021 в 17:08.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление прослушивания события Patr56 Общие вопросы Javascript 5 14.07.2015 16:57
Удаление обработчика события FanAizu Общие вопросы Javascript 3 23.08.2013 18:46
Назначение и удаление события (addEvent) beejuice Общие вопросы Javascript 3 05.08.2013 14:01
Удаление события mousemove DesiresDesigner Events/DOM/Window 5 13.05.2012 21:08
Удаление обработчика события belkir Events/DOM/Window 8 22.09.2011 12:47