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. ');
67
A
回答
92
你不能。您必須使用命名函數或以某種方式存儲參考。
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);
8
你不能,你需要一個參考功能:
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. ');
2
你也可以做到這一點像:
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();
+0
是否有可能確定哪些事件已被綁定在對象上? – frumbert 2017-11-07 05:36:52
+0
你可以在函數中添加一些屬性,比如類型,範圍等等 'const disposerFn =()=> {scope.removeEventListener(type,handler,capture); }' 'disposerFn.type = type;' 'return disposerFn;'' – 2017-11-13 13:25:32
相關問題
- 1. removeEventListener匿名函數的javaScript
- 2. removeEventListener for AS3中的匿名函數
- 3. removeEventListener與唯一匿名函數
- 4. 需要參數的addEventListener(和removeEventListener)函數
- 5. AddEventListener對匿名函數的動態函數引用
- 6. JavaScript:如何將匿名函數作爲函數參數傳遞?
- 7. 通過匿名函數作爲參數
- 8. 匿名函數使用#()
- 9. 如何將匿名函數提取爲命名函數?
- 10. 如何執行作爲參數傳遞的JQuery匿名函數?
- 11. addEventListener匿名函數中的Javascript變量範圍
- 12. EventListener正確地啓動,除非用匿名函數包裝,然後阻止RemoveEventListener
- 13. 如何在匿名函數上使用bind函數
- 14. 作爲參數的匿名函數的作用域
- 15. 使用匿名函數作爲JavaScript對象的一部分
- 16. 使用工廠方法作爲替代通過匿名函數
- 17. javascript setTimeout()不等待,即使作爲匿名函數調用後
- 18. 使用匿名函數作爲財產的getter/setter
- 19. Linq - 如何收集匿名類型作爲函數的結果
- 20. Golang函數包含匿名作用域
- 21. 在匿名函數中調用匿名函數(初始)
- 22. 將值作爲函數參數傳遞給匿名函數
- 23. 如何將匿名函數轉換爲常規函數?
- 24. 調用匿名函數定義爲PHP
- 25. 如何使用用C匿名函數的參數或C++
- 26. 作爲函數參數傳遞的匿名函數的作用域
- 27. 使用自我調用匿名函數
- 28. 如何爲此使用addEventListener?
- 29. 保存一個匿名函數(lambda)作爲函數型變量
- 30. Javascript addEventListener和removeEventListener與部分功能
你能解釋一下結構化的方式是什麼?我的英語技能不足以理解......謝謝。 – Japboy 2011-04-14 08:10:59
@Japboy:請參閱我的更新。 – 2011-04-14 08:24:02
感謝您的更新。這將有所幫助! – Japboy 2011-04-14 08:41:07