简体   繁体   English

区分键盘/鼠标触发的焦点事件

[英]Differentiate between focus event triggered by keyboard/mouse

I'm using jquery ui autocomplete and want to decipher between focus events triggered by keyboard interaction and mouse interaction. 我正在使用jquery ui自动完成,并希望在键盘交互和鼠标交互触发的焦点事件之间进行解密。 How would I go about this? 我该怎么做?

$('input').autocomplete({
    source: function(request, response) {
        ...
    },
    focus: function(event, ui) {
        // If focus triggered by keyboard interaction
            alert('do something');
        // If focus event triggered by mouse interaction
            alert('do something else');
    }
});

Thanks 谢谢

The only way I can think of doing this is to have a handler listen in on the keypress and click events, and toggle a boolean flag on/off. 我能想到这样做的唯一方法是让一个处理程序监听keypressclick事件,并打开/关闭一个布尔标志。 Then on the focus handler of your input, you can just check what the value of your flag is, and go from there. 然后在输入的focus处理程序中,您可以检查标志的值是什么,然后从那里开始。

Probably something like 可能是类似的东西

var isClick;
$(document).bind('click', function() { isClick = true; })
           .bind('keypress', function() { isClick = false; })
           ;

var focusHandler = function () {
    if (isClick) {
        // clicky!
    } else {
        // tabby!
    }
}

$('input').focus(function() {
    // we set a small timeout to let the click / keypress event to trigger
    // and update our boolean
    setTimeout(focusHandler,100);
});

Whipped up a small working prototype on jsFiddle (don't you just love this site?). 在jsFiddle上制作了一个小型工作原型(难道你不喜欢这个网站吗?)。 Check it out if you want. 如果你愿意,请查看。

Of course, this is all running off a focus event on an <input> , but the focus handler on the autocomplete works in the same way. 当然,这都是在<input>上运行focus事件,但自动完成的focus处理程序以相同的方式工作。

The setTimeout will introduce a bit of lag, but at 100ms, it might be negligible, based on your needs. setTimeout会引入一些延迟,但在100ms时,根据您的需要可能会忽略不计。

You should actually be able to determine this from the event-Object that is passed into the focus-event. 实际上,您应该能够从传递给焦点事件的event-Object中确定这一点。 Depending on your code structure this might be different, but there is usually a property called originalEvent in there, which might be nested to some depth. 根据您的代码结构,这可能会有所不同,但通常会有一个名为originalEvent的属性,它可能嵌套到某个深度。 Examine the event -object more closely to determine the correct syntax. 更仔细地检查event以确定正确的语法。 Then test on mousenter or keydown via regular expression. 然后通过正则表达式对mousenterkeydown进行测试。 Something like this: 像这样的东西:

focus: function(event, ui){
  if(/^key/.test(event.originalEvent.originalEvent.type)){
    //code for keydown
  }else{
    //code for mouseenter and any other event
  }
}

The easiest and most elegant way I've found of achieving this is to use the " What Input? " library. 我发现实现这一目标的最简单,最优雅的方法是使用“ 什么输入? ”库。 It's tiny (~2K minified), and gives you access to the event type both in scripts: 它很小(约2K缩小),并允许您在脚本中访问事件类型:

if (whatInput.ask() === 'mouse') {
  // do something
}

...and also (via a single data attribute that it adds to the document body ) styles: ...以及(通过它添加到文档body的单个数据属性)样式:

[data-whatinput="mouse"] :focus,
[data-whatinput="touch"] :focus {
  // focus styles for mouse and touch only
}

I particularly like the fact that where you just want a different visual behaviour for mouse / keyboard it makes it possible to do that in the stylesheet (where it really belongs) rather than via some hacky bit of event-checking Javascript (though of course if you do need to do something that's not just purely visual, the former approach lets you handle it in Javascript instead). 我特别喜欢这样一个事实:你只想要一个不同的鼠标/键盘视觉行为,它可以在样式表(它真正属于的地方)中这样做,而不是通过一些hacky bit事件检查Javascript(当然,如果你确实需要做一些不仅仅是纯粹的视觉效果,前一种方法可以让你用Javascript来处理它。

The first thing that comes to mind is that you can find the position of the mouse and check to see if its within the position of the element 首先想到的是你可以找到鼠标的位置并检查它是否在元素的位置

Use this to store the position of the element: 用它来存储元素的位置:

var input = $('#your_autocompleted_element_id'),
    offset = input.offset(),
    input_x = offset.top,
    input_y = offset.left,
    input_w = input.outerWidth(),
    input_h = input.outerHeight();

Then use this to find absolute position of the mouse within the window: 然后使用它来查找窗口内鼠标的绝对位置:

var cur_mx, cur_my;
$(document).mousemove(function(e){
   cur_mx = e.pageX;
   cur_my = e.pageY;
});

Then in your autcomplete setup: 然后在您的自动完成设置中:

focus: function(event, ui) {
   // mouse is doing the focus when...
   // mouse x is greater than input x and less than input x + input width
   // and y is greater than input y and less than input y + input height
   if (cur_mx >= input_x && cur_mx <= input_x + input_w && cur_my >= input_y && cur_my <= input_y + input_h) {
      // do your silly mouse focus witchcraft here
   } else {
      // keyboard time!
   }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM