簡體   English   中英

事件監聽器的傳遞參數

[英]passing parameter for event listener

  window.addEventListener('keydown',function keydown_f(e){
    if(e.code === 'ArrowDown') {
      window.removeEventListener('keydown',keydown_f);
      // do something
      setTimeout(2000,function(){
        window.addEventListener('keydown',keydown_f);
      });
    }
    else if (e.code === 'ArrowUp') {
      window.removeEventListener('keydown',keydown_f);
      // do something
      setTimeout(2000,function(){
        window.addEventListener('keydown',keydown_f);
      });
    }
  });

我使用上面的代碼每2秒捕獲一次keydown事件。 我以為那是行不通的,因為在2000ms之后,事件監聽器又被添加回去(第6行和第13行),它沒有指定獲取的參數,就像我在第一行中寫的那樣

  window.addEventListener('keydown',function keydown_f(){  //without "e"

那應該觸發一個錯誤

未捕獲的ReferenceError:未定義e

但是實際上代碼是有效的,我不明白為什么在將偵聽器加回去時可以識別e而沒有將e指定為參數?

因為是在其中設置“ function keydown_f”的上下文,所以可以訪問:

   if(e.code === 'ArrowDown') {
  window.removeEventListener('keydown',keydown_f);
  // do something
  setTimeout(2000,function(){
    window.addEventListener('keydown',keydown_f);
  });
}
else if (e.code === 'ArrowUp') {
  window.removeEventListener('keydown',keydown_f);
  // do something
  setTimeout(2000,function(){
    window.addEventListener('keydown',keydown_f);
  });
}

它在范圍內。

函數本身“ keydown_f”采用參數---“ e”。 因此,當您調用它時,可以說:window.addEventListener('keydown',keydown_f);

“事件”通過了。

基本上,“ addEventListener”會捕獲以下內容:“ keydown_f”,並執行以下操作:“ keydown_f(event)”

想想“ keydown_f”是一個回調,那么它就是一個回調。 “ addEventListener”使用該函數,然后“調用它”並傳遞其參數= event。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM