Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Удалить обработчик с вложенной функцией (https://javascript.ru/forum/misc/68673-udalit-obrabotchik-s-vlozhennojj-funkciejj.html)

TommyWork 01.05.2017 22:15

Удалить обработчик с вложенной функцией
 
Здравствуйте.

Если я хочу в свою функцию передать событие или просто переменные, то я пишу так:
//---------- Это в отдельном файле js подключается в head страницы
main_elem.addEventListener('mousedown' function(e) {
first(e);
});
main_elem.removeEventListener('mouseup' Myfunction);
//--------------------------------------------------------------------------------

// А это вложенный js тоже в head страницы------------------------------
function first(e) {
e = e || event;
elem.addEventListener('mousemove', function(e){
myFunction(e);
});
}

Причем если в функции не передавать (e) то например фаерфокс не понимает его внутри функции.

В моем примере происходит событие "mousedown", это событие порождает новое событие - "mousemove", когда же произойдет событие "mouseup", событие "mousemove" надо прекратить. Можно ли это сделать иначе? Если нет, то вопросы ниже.

Вопрос как такие обработчики удалять через removeEventListener(). Если его формат:
elem.removeEventListener('click', myFunction);
Где myFunction - функция без указания переданных переменных.
И как при создании таких обработчиков передать в функцию параметры помимо (e)?

Rise 02.05.2017 09:56

TommyWork,
1. addEventListener не происходит и не порождает событие, он назначает обработчик события на элемент, дословно добавитьСобытияСлушатель, произойдет событие или нет от него не зависит.

2. removeEventListener требует те же аргументы что были указаны в addEventListener, и чтобы оба метода во втором аргументе ссылались на один и тот же объект (функцию), отсутствующий третий аргумент равняется false:
function handler(e){}
// или
var handler = function(e){};
// или
var handler = {
    handleEvent: function(e){}
};

// ПРАВИЛЬНО
element.addEventListener('click', handler, false);
element.removeEventListener('click', handler, false);

// НЕПРАВИЛЬНО
element.addEventListener('click', handler, false);
element.removeEventListener('mousedown', handler, false);
// или
element.addEventListener('click', handler);
element.removeEventListener('click', handler, true);
// или
element.addEventListener('click', function(e){}, false);
element.removeEventListener('click', function(e){}, false);
// или
element.addEventListener('click', function handler(e){}, false);
element.removeEventListener('click', handler, false);

3. Первый параметр в обработчике независимо от имени всегда является объектом события, однако в атрибуте объект события передается словом event, а элемент события словом this, в произвольном порядке:
<input onclick="handler(this, event)">
<input onclick="handler(event, this)">
function handler(arg1, arg2){}

TommyWork 02.05.2017 15:23

Rise,
Спасибо)


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