我希望我的文本框具有以下功能:每当用户按下“回车”键时,它都会聚焦到最接近的下一个元素(包括输入框、复选框、按钮、单选框、选择框、a标签和div),只要它们可以被聚焦。如何使用jQuery实现这一功能?
我以前已经做过了。请尝试我的解决方案,这里是http://jsfiddle.net/R8PhF/3/
$(document).ready(function(){
$('#mytextbox').keyup(function(e){
var code = (e.keyCode ? e.keyCode : e.which);
if(code == 13) {
var tabables = $("*[tabindex != '-1']:visible");
var index = tabables.index(this);
tabables.eq(index + 1).focus();
}
});
});
顺便说一下,这是一个合法的技术问题,很可能是业务需求。我经常被要求在后台应用程序中构建这种行为。有许多本地应用程序都是这样运作的。
我通过使用contenteditable=true的DIV构建表单来满足此需求,如下面的示例所示。
<html>
<head>
<style type="text/css">
div.input { border:1px solid #aaa; width:300px; }
</style>
</head>
<body>
<div contenteditable="true" class="input"><strong>explore the world,</strong> e.g. paris, france</div>
</body>
</html>
算法方面:
保持一个可以聚焦的所有元素列表。不要依赖于DOM。你必须自己维护这个列表。如果你不知道页面上有哪些元素,那么你已经做错了什么事情。DOM是一个“视图”,而不是一个“数据存储”,因此要相应地对待它。许多使用jQuery的新手都会犯这个错误,而且使用jQuery很容易犯这个错误。
找到页面上所有可聚焦元素的位置。根据第1点,当然最好的方法是即使不查看DOM也能“知道”所有元素的相对位置。使用jQuery可以使用.dimension()
。您可能需要进行一些记录以使此列表保持最新(即当您的数据/视图更改时)。
找到当前聚焦元素的位置。
使用某种算法将其与其他位置列表进行比较,并获取“最接近”的元素(这可能意味着很多事情,您可能知道您想要什么)。
然后将焦点设置为该元素。
在这里你有很多选择,一些取决于性能,另一些则取决于交互和界面设计。
$("*[tabindex != '-1']:visible");
这样的语句会查询DOM并尝试推导出哪个元素是_next_。但是,当您渲染输入元素时,您已经知道它们的呈现顺序,因此您不需要查询DOM。只要逻辑简单,_jQuery_方法就可以工作,但是一旦引入了一点复杂性(例如:跳过字段、跳过按钮、最后一个字段应该提交),您将得到奇怪的代码。 - Halcyon