jquery触发焦点或单击操作,但不是两者

我有这个示例代码:

$myTrigger .click(function(e){ alert('click'); }) .focus(function(e){ alert('focus'); $(this).click() }) 

目的是当我点击$ myTrigger时我希望发生一些事情。 另一方面,如果您通过键盘(即焦点)对其进行选项卡,我希望完全相同的事情发生,所以我要求它点击。

问题是,如果我点击它,它也会集中注意力。 所以这两个警报都会消失。

有没有办法防止焦点事件在点击时熄灭?

更新:

Ajm的评论让我觉得我可能会问错了。

问题:点击事件是否总是在javascript(和/或jQuery?)中引发焦点。 我可以假设每当我想要同时使用鼠标进行单击并使用键盘进行Tabed-in时,focus()事件将同时处理两者?

或者它是否依赖于我附加事件的特定元素? (在这种情况下,$ myObject碰巧是一个锚标记(链接)。

jQuery有一个内置的function,没有使用通常称为.one()

 $mytrigger.one('click focus', function() { alert("event"); }); 

这只会触发一次,或者如果你想要,你可以重新绑定。

要触发TAB焦点的click()(并且当鼠标单击焦点时阻止click()被触发两次),我执行了以下操作:

 $('#item').mousedown(function(){ $(this).data("mouseDown", true); }); $('#item').mouseup(function(){ $(this).removeData("mouseDown"); }); $('#item').focus(function(){ if (!$(this).data("mouseDown")) $(this).click(); }); 

这对你有用吗?

我不久前遇到了类似的问题。 我通过响应第一个事件解决了它 ,并忽略了下一个20ms的事件。

尝试这样的事情:

 $(document).ready(OnReady); var okToClick = true; function OnReady() { //Attach to both click and focus events $("#item").click(PerformAction).focus(PerformAction); } function PerformAction() { if (okToClick) { okToClick = false; // Do something interesting here... setTimeout(function() { okToClick = true; }, 20); } } 

您只能使用focus()方法并阅读本文关于JavaScript的事件(e)类型: http : //www.quirksmode.org/js/events_properties.html

要检测您使用鼠标或键盘进行的事件(测试),您可以使用:

 if (!e) var e = window.event; alert(e.type); 

为了防止焦点被调用两次,设置一个变量来判断元素是否具有焦点。

 var hasFocus = false; $('#myTrigger').focusIn( function(){ hasFocus = true; //do stuff } ); $('#myTrigger').focusOut( function(){ hasFocus = false; } ); 

将所有function放在焦点上并告诉jQuery在点击元素时设置元素,如果你遇到不这样做的浏览器。

 $(#myTrigger).click( function(){ if(!hasFocus){$(#myTrigger).focus()}}); 

另一种选择是:

 $myTrigger .mousedown(function(e) { e.preventDefault(); // don't grab focus }) .click(function(e) { alert('click'); }) .focus(function(e) { alert('focus'); $(this).click() }); 

这将使键盘聚焦在单击按钮之前的任何位置,同时仍然允许按钮通过Tab聚焦(或以编程方式调用.focus() )。