2011-09-12 51 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

我不能有那么多的事件处理程序......这些表单很大。这肯定会锁定浏览器。 –

相关问题