2010-12-20 58 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(); 
    } 
    }); 
});