Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jquery在焦点或单击时触发操作,但不能同时触发两者_Jquery_Focus_Click - Fatal编程技术网

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()
    });