2012-09-17 49 views
2

可能重複:
Javascript event handler on body but not on input獲取JavaScript keydown事件只有不寫

我寫了監聽的keydown事件很短的劇本,但我想,如果忽略它,我正在寫文本字段。

我不知道如何做到這一點沒有奇怪的技巧,如檢查是否有重點放在其中一個輸入。

這是我現在的代碼。

document.addEventListener('keydown', function(event) { 
    if(event.keyCode == 71) { 
     showSelected(); 
    } 
    else if(event.keyCode == 13) { 
     closeModal(); 
    } 
}); 
+0

壞的解決方案是該keydown監聽器添加到所有輸入字段,並停止傳播。應該有更聰明的解決方案。 – Shmiddty

+0

請參閱:http://stackoverflow.com/questions/7230976/javascript-event-handler-on-body-but-not-on-input – Shmiddty

回答

4

這是一個有點棘手,如果你正在做的事情與contenteditable(如讓用戶寫任何的div /跨度/盒的內文,他們希望在頁面上)。

如果是這樣,這將需要一點思考和修改(這不是很難 - 只是更多的參與)。

但是,您可以根據要排除的類型列表檢查event.target(發生該事件的元素)的tagName屬性。

function keyEvent (evt) { 
    var key = evt.keyCode, 
     el = evt.target, 
     type = el.tagName.toLowerCase(); 
     // tag names are upper-case... almost always... 
     // so convert one way or the other, to be sure 
    if (type === "input" || type === "textarea") { return; } 
    /* do whatever you were going to do */ 
} 

也應該注意到,這個解決方案(和你的代碼至此)不是貧民窟-IE兼容的。 爲此,您需要使用attachEventwindow.eventwindow.event.srcElement屬性,因爲它們不支持addEventListenere/event函數參數。

+0

+1對於「貧民窟-IE」參考 –

+0

人們不應該忘記'選擇'元素等。實際上,當我實現這樣一個功能時,我使用了'evt.target.matchesSelector(「form *」)'。 – Bergi

+0

你可以檢查它是否是'event.target.isContentEditable'的contenteditable'元素。 – morkro

1

只是檢查了event.target

{ 
    if (event.target.tagName.toUpperCase() == 'INPUT') return false; 

    // Do your Coding 
}