2

我有一個關於JS中的鍵盤事件的問題。JS - 鍵盤事件 - 聽/ UNLISTEN

首先,請不要回答我使用jQuery方法,我知道大部分(綁定/解除綁定,開/關,一個...),但我與有一個內部框架而努力沒有jQuery,即使我們大部分項目都使用了jQuery。因此,我有一個模塊,實際上是一個基於Swipe.js的滑動工具,並且可以在Web和移動環境中工作(兼容IE 7+,WebKit(Chrome & Safari),Moz,Opera和IE10/Windows Phone)

在對鼠標/觸摸事件沒有任何問題的情況下,受0123xx啓發的綁定和解除綁定方法對於detachEvents方法的小修改似乎很有效。

然後我會根據「的keydown」事件來實現鍵盤控制功能。我不確定keyydial和keypress事件之間有什麼區別,除了keypressEvent.preventDefault()不阻止小滾動效果,所以我使用keydown。)

因爲可以添加在同一頁上許多揮筆,我開始聽,只有當任何刷卡聚焦該keydown事件(請注意,我添加了一個「的tabindex」屬性,以使該元件得到集中)。

<div id="swipe1" class="swipe" tabindex='0'> 
    <ul> 
     [...] 
    </ul> 
</div> 

然後,當輕掃處理 'touchstart'/ '點擊'/ 'MSPointerDown' 事件, 我關注它:

onTouchStart: function(e) { 
    this.container.focus(); // Refers to the div#swipe1.swipe element 
    [...] 
    return false; 
} 

onFocus: function (e) { 
    if (this.activateKeyboardControls) { // Keyboard control is optional 
     this.addListener(document, 'keydown', this, true); 
    } 
} 

onBlur: function (e) { 
    if (this.activateKeyboardControls) { // Keyboard control is optional 
     this.removeListener(document, 'keydown', this, true); 
    } 
} 

但不幸的是,的removeListener不起作用。

我的意思是,當元素失去焦點(blur事件解僱),但它仍然處理的keydown事件......

是因爲它是在文檔對象上綁定? 我已經閱讀了一些使用一些布爾值的解決方案,但我正在尋找一種更乾淨的方式來管理它。

這是煩人的,因爲當我將焦點放到許多揮筆,他們每個人的是,當我按下鍵盤swipping。

在此先感謝!

回答

0

我不知道爲什麼我的回答已被刪除的原因 - 發佈後2周以上 - 但無論如何,這是我如何解決它:

它來自的「類型」參數的addEventListener /的attachEvent方法,第一個這樣的...

我結合它的對象上,而不是在窗口上,並且在不起泡。

var target = e.target || e.srcElement; 
if (this.activateKeyboardControls) { 
    this.addListener(target, 'keydown', this, false); 
}