function doSomethingWith(param)
{
document.body.addEventListener(
'scroll',
function()
{
document.write(param);
},
false
); // An event that I want to remove later
}
setTimeout(
function()
{
document.body.removeEventListener('scroll', HANDLER ,false);
// What HANDLER should I specify to remove the anonymous handler above?
},
3000
);
doSomethingWith('Test. ');
88
Ответы:
Вы не можете. Вы должны использовать именованную функцию или как-то сохранить ссылку.
var handler; function doSomethingWith(param) { handler = function(){ document.write(param); }; document.body.addEventListener('scroll', handler,false); } setTimeout(function() { document.body.removeEventListener('scroll', handler ,false); }, 3000);
Лучше всего сделать это структурированным способом, чтобы вы могли идентифицировать разные обработчики и удалять их. В приведенном выше примере вы, очевидно, могли удалить только последний обработчик.
Обновить:
Вы можете создать свой собственный обработчик (:)):
var Handler = (function(){ var i = 1, listeners = {}; return { addListener: function(element, event, handler, capture) { element.addEventListener(event, handler, capture); listeners[i] = {element: element, event: event, handler: handler, capture: capture}; return i++; }, removeListener: function(id) { if(id in listeners) { var h = listeners[id]; h.element.removeEventListener(h.event, h.handler, h.capture); delete listeners[id]; } } }; }());
Затем вы можете использовать его с:
function doSomethingWith(param) { return Handler.addListener(document.body, 'scroll', function() { document.write(param); }, false); } var handler = doSomethingWith('Test. '); setTimeout(function() { Handler.removeListener(handler); }, 3000);
ДЕМО
источник
i
иlisteners
«в частном порядке».Нельзя, нужна ссылка на функцию:
function doSomethingWith(param) { var fn = function(){ document.write(param); }; document.body.addEventListener('scroll', fn, false); setTimeout(function(){ document.body.removeEventListener('scroll', fn, false); }, 3000); } doSomethingWith('Test. ');
источник
var fn = function(event){ document.write(param); };
Вы также можете сделать это так:
const ownAddEventListener = (scope, type, handler, capture) => { scope.addEventListener(type, handler, capture); return () => { scope.removeEventListener(type, handler, capture); } }
Затем вы можете удалить прослушиватель событий следующим образом:
// Add event listener const disposer = ownAddEventListener(document.body, 'scroll', () => { // do something }, false); // Remove event listener disposer();
источник
const disposerFn = () => { scope.removeEventListener(type, handler, capture); }
disposerFn.type = type;
return disposerFn;
если вам не нужно поддерживать IE, вы можете использовать опцию Once
[Element].addEventListener('click', () => {...}, { capture: false, once: true });
источник