jquery在焦点或单击时触发操作,但不能同时触发两者
我有以下示例代码:jquery在焦点或单击时触发操作,但不能同时触发两者,jquery,focus,click,Jquery,Focus,Click,我有以下示例代码: $myTrigger .click(function(e){ alert('click'); }) .focus(function(e){ alert('focus'); $(this).click() }) 我的意图是,当您单击$myTrigger时,我希望发生一些事情。另一方面,如果你通过键盘(即,焦点)点击它,我希望完全相同的事情发生,所以我要求它点击 问题是如果我点击它,它也会聚焦
$myTrigger
.click(function(e){
alert('click');
})
.focus(function(e){
alert('focus');
$(this).click()
})
我的意图是,当您单击$myTrigger时,我希望发生一些事情。另一方面,如果你通过键盘(即,焦点)点击它,我希望完全相同的事情发生,所以我要求它点击
问题是如果我点击它,它也会聚焦。所以这两个警报都在发出
是否有方法防止单击时焦点事件关闭
更新:
Ajm的评论让我觉得我可能问错了
问题:在javascript(和/或jQuery)中,点击事件是否总是触发焦点。我是否可以假设,每当我想同时处理鼠标点击和键盘切换时,focus()事件将同时处理这两个问题
还是取决于我将事件附加到的特定元素?(在本例中,$myObject恰好是一个锚定标记(link)。我不久前遇到了类似的问题。我通过响应第一个事件并忽略接下来20毫秒的事件而 试着这样做:
$(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)类型的文章: 要检测鼠标或键盘发生的事件(进行测试),您可以使用:
if (!e) var e = window.event;
alert(e.type);
要防止调用焦点两次,请设置一个变量以告知元素是否具有焦点
var hasFocus = false;
$('#myTrigger').focusIn(
function(){
hasFocus = true;
//do stuff
}
);
$('#myTrigger').focusOut(
function(){
hasFocus = false;
}
);
将所有功能放在焦点上,并告诉jQuery在单击元素时设置foucus(如果您运行的浏览器没有这样做)
$(#myTrigger).click( function(){ if(!hasFocus){$(#myTrigger).focus()}});
jQuery有一个内置的函数,它并没有被经常调用 这将只触发一次,或者如果以后需要,可以重新绑定。要触发选项卡焦点的click()(并防止鼠标点击焦点时click()被触发两次),我执行了以下操作:
$('#item').mousedown(function(){
$(this).data("mouseDown", true);
});
$('#item').mouseup(function(){
$(this).removeData("mouseDown");
});
$('#item').focus(function(){
if (!$(this).data("mouseDown"))
$(this).click();
});
这对你有好处吗?另一个选择是:
$myTrigger
.mousedown(function(e) {
e.preventDefault(); // don't grab focus
})
.click(function(e) {
alert('click');
})
.focus(function(e) {
alert('focus');
$(this).click()
});
这将使键盘在单击按钮时保持焦点位置,同时仍然允许按钮通过Tab(或通过编程方式在其上调用
.focus()
聚焦).为什么不干脆放弃单击功能,只保留焦点?如果每次单击都是焦点,并且您希望它同时作用于单击和焦点,那么只使用焦点。将操作设置为单击和焦点调用的外部函数是否更有意义?这将有点完全跳过此问题。>>请忽略下面的注释。@ajm It仍将运行该函数两次,因为当您单击焦点时happens@Adam:如果我确信这是标准的浏览器行为,那就行了。是吗?@ajm:这不能解决问题……函数只会被调用两次。对不起,伙计们,我想的是一个函数调用另一个函数。焦点确实会以cl或cl为前提点击元素或类似于它的标签,这取决于您正在使用的元素的类型。在$myTrigger中是什么类型的元素?我不会说这是一个解决方案,因为这是一个围绕这个问题的丑陋的破解。是的。这是一个破解。不能在那里争论。但在我的情况下,这是唯一的解决方案。我想我的问题是真的“焦点总是在点击时被调用吗?”@DA-是的,因为当你点击元素时,你激活的也是焦点,因为你的焦点在该元素中。:)嗯,我做了一个测试,但情况似乎并非如此。例如,你不能给一个DIV一个焦点事件,然后点击它并激活该事件。这似乎只适用于“聚焦”元素。你是对的。但是在HTML5中,每个元素都可以成为“聚焦”的:你只需要添加一个“tabindex”“将属性添加到元素中。如W3C ARIA草案所示:。(我知道这是一个老话题,但谷歌在2013年把我送到了这里!)好的观点。您必须设置一个变量,以查看它是否已获得焦点。它是调用“这两个事件中的一个”还是调用“每个事件一次”?文件上没有说。(显然,我可以尽可能快地通过遗嘱进行尝试…)在文档中,它说如果发生多个事件,每个事件类型将调用一次。
$myTrigger
.mousedown(function(e) {
e.preventDefault(); // don't grab focus
})
.click(function(e) {
alert('click');
})
.focus(function(e) {
alert('focus');
$(this).click()
});