2010-12-20 67 views
12

用戶不喜歡Enter鍵提交頁面的事實。所以我的任務是阻止提交併將Enter鍵更改爲Tab到下一個字段。更改從提交到選項卡?

我已經嘗試了很多在網上找到的JavaScript片段,但目前爲止還沒有工作。唯一一個已經接近產生效果的是e.preventDefault(),它阻止了提交,但我沒有嘗試過模擬選項卡行爲。

e.returnValue = false; 
e.cancel = true; 

Page仍然在keydown事件處理程序中與上述提交。與keydown事件處理函數中的return false效果相同。該處理程序正在發射,通過用螢火蟲在其中放置斷點進行測試。

這需要與IE和Firefox兼容。

不要說「不要這樣做」。
1)我已經確信我不應該這樣做,但這不是我的選擇,所以討論是靜音的。
2)這將是「我應該這樣做嗎?」這個問題的答案,這不是我問的問題。

+0

爲什麼不使用'e.preventDefault()'來停止提交,然後使用別的東西來移動焦點?畢竟,您可以將多個動作放入事件處理程序中。 – 2010-12-20 22:23:57

+0

已經嘗試了各種模擬Tab鍵的建議組合,並結合e.preventDefault(),但還沒有找到任何可用的工具。 – AaronLS 2010-12-20 22:25:32

+0

我以前聽說過這樣的要求,但我認爲這是不可能的。我認爲你應該說服你的客戶,這是錯誤的方式。 – Christian 2010-12-20 22:25:43

回答

10

這只是感覺噁心,但你可以使用event.preventDefault如你所說,然後下一個最接近輸入呼叫focus()

這裏有一個簡單的例子:

$("input").bind("keydown", function(event) { 
    if (event.which === 13) { 
     event.stopPropagation(); 
     event.preventDefault(); 
     $(this).next("input").focus(); 
    } 
}); 

例子:http://jsfiddle.net/andrewwhitaker/Txg65/

更新:如果您的輸入之間有元素,使用普通next()將不起作用。相反,使用nextAll()

$("input").bind("keydown", function(event) { 
    if (event.which === 13) { 
     event.stopPropagation(); 
     event.preventDefault(); 
     $(this).nextAll("input").eq(0).focus(); 
    } 
}); 

http://jsfiddle.net/andrewwhitaker/GRtQY/

+1

此外,對於IE來說,你需要使用'event.cancelBubble = true',這樣它纔不會冒泡(並將表單或選項卡提交給下一個輸入)。請參閱http://www.quirksmode.org/js/events_order.html#link9。 – Andre 2010-12-20 22:47:35

+1

感謝您的提示,增加了'event.stopPropagation()',我相信它可以在IE/FF中工作,因爲它是jQuery的事件對象上的一個函數。 – 2010-12-20 22:53:11

+0

+1讓我走上正確的軌道,但不起作用我認爲,因爲我在輸入框之間有東西。以前從未使用小提琴,但我認爲這應該顯示我的意思:http://jsfiddle.net/xpxB6/ 雖然能夠得到一個解決方案,現在發佈它。 – AaronLS 2010-12-21 00:18:52

2
$("input").bind("keydown", function(event) { 

    if (event.which === 13 && this.type !== 'submit') { 
     event.preventDefault(); 
     $(this).next("input").focus(); 
    } 
}); 
1

在此基礎上一篇: http://forum.jquery.com/topic/how-to-find-next-node-in-focus-order

我想出了這個。我最終選擇不使用focasables,而是使用輸入來獲得我想要的效果。 .not是爲了防止圖像按鈕和提交按鈕受到影響,以便他們只要有焦點就仍然有默認的輸入提交動作。

$(document).ready(function() { 
var focusables = $(":input").not('[type="image"]').not('[type="submit"]'); 

    focusables.keydown(function(e) { 
    if (e.keyCode == 13) { 
     e.preventDefault(); 
     var current = focusables.index(this), 
       next = focusables.eq(current + 1).length ? focusables.eq(current + 1) : focusables.eq(0); 
     next.focus(); 
    } 
    }); 
});