Подтвердить что ты не робот

Обнаружить фокус, инициированный клавишей табуляции?

Я хочу определить событие фокусировки элемента, но только если оно было инициировано пользователем, нажимая клавишу табуляции. Например:

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

Если пользователь сфокусирован на #foo и нажимает Tab, я хочу, чтобы событие срабатывало один раз, когда #detect становится сфокусированным (или условным внутри события фокусировки, чтобы оно было истинным). И наоборот, если пользователь просто нажимает на поле #detect, чтобы сфокусировать его, я не хочу, чтобы событие срабатывало (или я хочу, чтобы условие внутри вызова события фокусировки было ложным).

Я не хочу использовать событие keydown #foo и проверять, была ли нажата клавиша табуляции, так как я хочу, чтобы этот подход не зависел от какого-либо другого элемента.

Я просмотрел вывод консоли из следующего кода, но не заметил никаких реальных различий между двумя методами фокусировки:

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

(fiddle)

Можно ли сделать это относительно простым способом?

4b9b3361

Ответ 1

Я знаю, что вы приняли ответ, но вы можете протестировать кнопку нажатой, используя следующее:

$('#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/

Ответ 2

Более отзывчивым решением будет использование двух слушателей:

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

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

Скрипка, показывающая разницу в скорости:

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

Ответ 3

Как вы заметили, сам объект события не отличает средства доступа. Что вы можете сделать, это связать прослушиватель mousedown, который будет срабатывать до focus, и установить некоторый флаг временной метки, который вы сравниваете с некоторым пороговым значением в вашем обработчике focus.

Ответ 4

Вы можете проверить событие фокусировки на конкретном входе с помощью этого кода

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

(скрипка)

Ответ 5

<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>