检测由tab键启动的焦点?

时间:2013-04-22 10:16:10

标签: javascript jquery javascript-events event-handling

我想检测元素的焦点事件,但仅当用户按Tab键启动时才会检测到它。例如:

<input type="text" id="foo" />
<input type="text" id="detect" />

如果用户专注于#foo并按下 Tab ,我希望在#detect聚焦后触发事件(或焦点事件中的条件为真)。相反,如果用户只是单击#detect字段来聚焦它,我不希望事件触发(或者我希望焦点事件调用中的条件为假)。

我不想使用#foo的keydown事件并检查Tab键是否被按下,因为我希望该方法独立于任何其他元素。

我查看了以下代码的控制台输出,但未注意到两种聚焦方法之间存在任何实际差异:

$('#detect').on('focus', function(e){
   console.log(e); 
});

fiddle

这是否可以以相对简单的方式完成?

6 个答案:

答案 0 :(得分:42)

我知道您接受了答案,但您可以使用以下方法测试按下的按钮:

$('#detect').on('focus', function(e){
    $(window).keyup(function (e) {
        var code = (e.keyCode ? e.keyCode : e.which);
        if (code == 9) {
           alert('I was tabbed!');
        }
    });
});

http://jsfiddle.net/LPGLm/1/

编辑:更改听众:

$(window).keyup(function (e) {
    var code = (e.keyCode ? e.keyCode : e.which);
    if (code == 9 && $('#detect:focus').length) {
        alert('I was tabbed!');
    }
});

http://jsfiddle.net/LPGLm/7/

答案 1 :(得分:7)

更具响应性的解决方案是使用两个侦听器:

var mousedown = false;
$('#detect').on('mousedown', function () {
    mousedown = true;
});

$('#detect').on('focusin', function () {
    if(!mousedown) {
        // logic
    }
    mousedown = false;
});

小提琴显示速度的差异:

http://jsfiddle.net/u2y45/1/

答案 2 :(得分:1)

正如您所注意到的,事件对象本身并不区分访问方式。您可以做的是绑定mousedown侦听器,该侦听器将在focus之前触发,并设置一些时间戳标记,与focus中的某个阈值进行比较处理程序。

答案 3 :(得分:0)

您可以通过此代码检查特定输入的焦点事件

$(window).on('keyup', function(event){
    if(event.keyCode == '9'){

      getFocused(event);
    }

})
var focused = 0;
function getFocused(e){
var ida =  $(':focus').eq(0).prop('id');
    if(ida=='detect' && focused==0){
        focused = 1;
        console.log(e);
    }
}

(fiddle)

答案 4 :(得分:0)

<input type="text" id="foo" />
<input type="text" id="detect" />
<script>
 $("#foo").on('keyup', function(){    
   document.getElementById("detect").value = "007";  
    alert("your tab active successfully");  
   });  
 </script>

答案 5 :(得分:0)

我使用以下内容:

(function() {
  const tabHistory = [];

  window.addEventListener('keyup', function (e) {
    const code = e.keyCode || e.which;
    const index = tabHistory.length === 0 ? 1 : tabHistory.length + 1;

    if (code == 9) {
      tabHistory.push({
        element: e.target,
        index
      });

      console.log(index, e.target, tabHistory);
    }
  });
})();

我建议跟踪关注的元素,这样可以确保用户能够按期望的方式切换。

Console Screenshot

希望有帮助!