2011-09-12 71 views
6

我在我的一個網站上有一個可用性問題。我有一組選項卡,每個都包含一個表單。當您單擊標籤鏈接時,它會將焦點放在標籤內容正文中的第一個文本框。面向鼠標的人喜歡這個「功能」。問題在於面向鍵盤的用戶使用鍵盤上的TAB鍵通過選項卡。他們在他們想要查看的標籤上點擊輸入,點擊事件觸發並且標籤顯示,但焦點被賦予文本框,完全調整它們的標籤順序。因此,當他們再次點擊標籤時,他們想要轉到屏幕上的下一個標籤,但由於焦點已移到表單內,因此無法使用鍵盤輕鬆進入下一個標籤。jQuery點擊事件 - 如何判斷鼠標是否被點擊或輸入密鑰被按下?

因此,在點擊事件中,我需要確定它們是否實際上用鼠標按鈕點擊了它。這可能嗎?我第一次嘗試是這樣的:

$("#tabs li a").click(function(e) { 
    var tab = $(this.href); 
    if(e.keyCode != 13) 
    $("input:first", tab).focus(); 
}); 

keyCode始終爲0。which屬性也始終爲0。請幫幫忙!

+0

您可以通過在文本框中添加一個.focus()處理程序並添加一點邏輯來破解它。 – krasnerocalypse

+0

@krasnericalypse錯誤,不是真的。一旦將焦點放在文本框/下拉框中,恢復就太遲了。 –

+0

哈哈。這是困難的一個。 – krasnerocalypse

回答

4

下面是我提出的解決方案,它非常簡單。我被困在KEYDOWN標籤鏈接,並觸發click事件時鍵代碼爲13。幸運的是,trigger功能允許我們額外的參數傳遞給事件處理程序...

$("#tabs li a").keydown(function(e) { 
    if(e.keyCode == 13) { 
    $(this).trigger("click", true); 
    e.preventDefault(); 
    } 
}); 

所以我不得不改變我點擊處理程序來接收新參數並使用它...

$("#tabs li a").click(function(e, enterKeyPressed) { 
    if(enterKeyPressed) 
    alert("Enter key"); 
    else 
    alert("Clicked"); 
}); 

我也放了一個demo on jsFiddle。感謝所有讀過這個問題的人。

+0

我做了4分鐘左右的相同事情,我們是天才= P – AgelessEssence

0

全局「焦點」變量是否工作,在給定選項卡上的選項卡使用後禁用鼠標設置,直到鼠標移動到新塊爲止。

這不會是你要求的功能,但我相信它可能會給你你想要的東西。

例如。鼠標hoovers選項5,你點擊標籤,現在你將5存儲在變量中,不允許焦點到5,直到其他焦點集中,但只要其他東西集中,全局變回-1。

不是最乾淨的解決方法我承認自由。

+0

我不能有那麼多的事件處理程序......這些表單很大。這肯定會鎖定瀏覽器。 –

相關問題