Как мне найти новый элемент фокуса с помощью jquery? - PullRequest
2 голосов
/ 20 января 2011

У меня есть всплывающее диалоговое окно, которое позволяет вам писать текст и делать вещи, когда вы нажимаете кнопку. Мой код ниже

Эта функция работает, я нахожу новый объект, посмотрев на e.originalEvent.explicitOriginalTarget. Однако теперь я замечаю, что если я нажму tab, эта функция будет вызвана, но e.originalEvent.explicitOriginalTarget выдаст мне тот же текущий объект вместо нового объекта. Так что мой диалог не закрывается, если пользователь нажимает клавишу Tab, чтобы выйти. Как мне найти правильный новый предмет дом?

$('#Area').focusout(function (e) {
    if ($(e.originalEvent.explicitOriginalTarget).closest('#Area').size() == 0)
        $('#Area').hide();
});

Ответы [ 2 ]

13 голосов
/ 19 сентября 2013

event.relatedTarget работал для меня. Это даст другой элемент DOM, внутри события, если таковой имеется.

Примером может быть, если у вас есть 2 кнопки, управляющие одной и той же функцией, и вы не хотите, чтобы их код выполнялся, если на них нажимали последовательно. Вы можете прикрепить обработчик события focusout и проверить идентификатор или имя класса.

$(".buttons").on("focusout", function (event) {
    if($(event.relatedTarget).prop("class").indexOf("buttons") === -1) {
        //code to execute
    }
});

Возможно, лучшим примером была бы проблема, с которой я столкнулся.

Я создал собственный выпадающий список, рядом с которым есть кнопка. Выпадающий список можно открыть и закрыть, нажав на список или кнопку. Он также может быть закрыт, теряя фокус на любом объекте.

Это становится проблемой в следующем сценарии. 1) пользователь открывает раскрывающийся список, щелкая объект списка. 2) пользователь закрывает выпадающий список, нажимая кнопку.

Что происходит, когда список открывается, но когда пользователь уходит, чтобы закрыть список, список теряет фокус, который закрывает его, но, поскольку они нажимают на кнопку, он открывается снова. Фокусировка приводит к тому, что два объекта взаимно компенсируют друг друга в сценарии этого типа.

Записав событие focusout, я теперь могу установить его срабатывание только в том случае, если relatedTarget не имеет тот же класс, что и цель, вызвавшая событие.

$(".listControl").on("focusout", function (event) {
    if($(event.relatedTarget).prop("class").indexOf("listControl") === -1) {
        //Close the drop down list
    }
});

http://api.jquery.com/event.relatedTarget/

2 голосов
/ 20 января 2011

Проверьте этот вопрос / ответ Как выбрать элемент, который фокусируется на нем, с помощью jQuery

Я думаю, почему вы ничего не получаете с $ ("*:фокус ");в консоли Firebug, когда вы нажимаете консоль, элемент теряет фокус.

А если вы хотите использовать его для событий, противоположность focus () равна blur ().


Редактировать

Возможно, вы даже можете попробовать другой подход.Если ваша единственная задача - следить за клавишей табуляции, вы можете использовать событие .keypress () и следить за табуляцией код клавиши , равной 9.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...