Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   удаление с обработчика анонимную функцию (https://javascript.ru/forum/css-html/82270-udalenie-s-obrabotchika-anonimnuyu-funkciyu.html)

fxobject 11.04.2021 22:41

удаление с обработчика анонимную функцию
 
Приветствую!
Вот такое дело:
нужно поймать нажатие мыши:
делаю вот так:
this.deviceCase.addEventListener('mousedown', вот тут обработчик
беда в том, что хотелось бы в обработчике получить сразу this
поэтому вариант обертки - что то типа
callingClassMethod( method, parametr ){
let __this = this;
return function(){
let argumentArray = Array.prototype.slice.call( arguments,0 );
if ( !(parametr === undefined )) argumentArray.push(parametr);
__this[method].apply( __this,argumentArray );
}
}
все замечательно. залетаем в событие, this стоит на месте.
Но! в событии нужно удалить обработчик. И тут начинается пипец. Потому как функция безымянная.
можно конечно поставить в качестве обработчика функцию класса, но тогда на входе нужно колдовать с this, брать его хоть через data...
подскажите оптимальное решение! Что то в голову ничего не приходит. Ни какой хитрости......
Понимаю что безымянную нужно убирать, но как оптимально потом взять this??? Через data ну совсем отпад

fxobject 11.04.2021 23:13

а jquery справляется:
$(this.deviceCase).on('mousedown', this.mouseClickMoveDevice.bind(this));
и this на месте и именованный обработчик (можно удалять).
но как он это делает???
Кто-нибудь знает?

fxobject 11.04.2021 23:16

все! спасибки и сори за тему. разобрался... )

рони 11.04.2021 23:19

fxobject,
мысли вслух ...
<div id="slider">

test

</div>
<script>
class RootElement {
	constructor(selector) {
		this.deviceCase = document.querySelector(selector);
        this.mousedown = this.fun.bind(this);
        this.deviceCase.addEventListener('mousedown',  this.mousedown)
	}

   fun(event) {
   alert([this.deviceCase.id, event.type]);
   this.deviceCase.removeEventListener('mousedown',  this.mousedown)
   }
}
new RootElement('#slider')
</script>

fxobject 11.04.2021 23:41

1. через присвоение переменной класса
правда делал так
this.mousedown = function(){}....
получалась также безымянная.
c bind конечно работает.
работает проста даже так
this.deviceCase.addEventListener('mousedown',this. mouseClickMoveDevice.bind( this ),false);
2. а вот вопрос а где же хранится сам объект new RootElement('#slider')?
по идее вышли из контекста где делается new и объект ушел в мусорную корзину.
какова практика JS? или к глобальным переменным его типа window.MyClass = new...
или в data
как то после других языков не очень понятно
тогда ссылки на объект торчат железно


Часовой пояс GMT +3, время: 07:09.