2016-07-22 48 views
1

如果我有一個文本框和按鈕:

<input id='text'/> <button id='btn'>Click me</button> 

我的按鈕將焦點設置到文本框的地方在它的單擊事件:

$(document).ready(function(){ 

    $('#btn').click(function(event){ 
    console.log('btn '); 
    $('#text').focus(); 
    }); 

    $('#text').keyup(function(event){ 
    console.log('key '); 
    }); 

}); 

...如果你使用回車鍵觸發按鈕單擊,不知何故,接收焦點的文本元素也會收到輸入按鍵。

這裏是展示此行爲的小提琴:

https://jsfiddle.net/qup6keLd/

使用Tab鍵將焦點設置到該按鈕,然後按Enter鍵。這兩個事件都將被觸發。使用空格觸發按鈕的點擊不會執行此操作。爲什麼會發生這種情況,以及如何防止它(除去focus()調用之外)?

+0

我認爲該事件被傳播下來的樹。您可以消耗事件以防止它傳播,但我不記得如何。 – Carcigenicate

+1

@Carcigenicate'e.stopPropgation()' – Polyov

+0

這是一個很好的答案,它處理[Javascript中的事件](http://stackoverflow.com/questions/4616694/what-is-event-bubbling-and-capturing) – Polyov

回答

1

使用keypress事件而不是keyup事件。

jQuery documentation details兩者的區別。

請參閱更新的小提琴:

$(document).ready(function(){ 
    $('#text').keypress(function(event){ 
    $('#output').append('key '); 
    }); 
    $('#btn').click(function(event){ 
    $('#text').focus(); 
    $('#output').append('btn '); 
    }); 
}); 

Updated Fiddle

+0

謝謝,這是訣竅。我認爲文檔中的關鍵句子是「一個按鍵事件處理程序可以附加到任何元素,但事件只發送給具有焦點的元素**」 – user1219358