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/