2011-04-14 128 views
67
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. '); 

回答

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); 

DEMO

+0

你能解釋一下結構化的方式是什麼?我的英語技能不足以理解......謝謝。 – Japboy 2011-04-14 08:10:59

+1

@Japboy:請參閱我的更新。 – 2011-04-14 08:24:02

+0

感謝您的更新。這將有所幫助! – Japboy 2011-04-14 08:41:07

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. '); 
+0

你怎麼傳遞事件對象? – slier 2014-03-16 02:11:03

+0

@slier'var fn = function(event){document.write(param); };' – cychoi 2014-10-31 11:19:12

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

相關問題