ОБНОВЛЕНИЕ 2:
Я выспался, а затем набросал пример кода, чтобы попытаться разобраться в проблеме.
Вот пример использования console.log firebug, чтобы показать вам, какой объект запускает событие focusin:
1) нажмите на первую ссылку: отображается желтый div 2) нажмите клавишу табуляции: она должна перейти в ссылку внутри желтого div
Он делает это, но затем вызывает событие focusin и по какой-то причине кажется, что он снова всплывает к красному div, которому приказано закрыть желтый div.
Это даже после того, как я сказал желтому div не распространять события focusin:
$('#innerDiv').focusin(function(e){e.stopPropagation()});
Затем я попытался прикрепить событие focusin к родительскому div только ПОСЛЕ того, как я сосредоточился на внутреннем div.
Что происходит, так это то, что переход к первой ссылке во внутреннем div действительно устанавливает событие focusin в родительском div. Это хорошо! Но затем при переходе к самой следующей ссылке внутри innerdiv событие focusin снова закрывает div.
Так что, думаю, я все еще в тупике. Похоже, я не могу остановить пузырение фокусина. Мысли? Теории?
Оригинал поста ниже...
============================
Я показываю div через событие onclick. Если вы щелкнете за пределами div, я хочу скрыть его. Для этого я привязываю однократное событие клика к телу:
$('body').one('click.myDivPopup', function(e) {
...close my div...
});
Внутри самого div я говорю ему не распространять события, чтобы фактическое нажатие внутри div не вызывало щелчок по телу:
$myDiv.click(function(e){e.stopPropagation()});
Это отлично работает, как задумано.
Я также хочу скрыть div, если вы выходите из div.
Я думал, что в этом сценарии я мог бы использовать событие focusin для тела:
$('body').one('focusin.myDivPopup', function(e) {
...close my div...
});
Опять же, я не хочу, чтобы события всплывали из самого div, поэтому добавил это:
$myDiv.focusin(function(e){e.preventDefault()});
Это не работает. Изменение фокуса внутри элементов внутри myDiv вызывает событие focusin для тела.
Может быть, это ошибка в jQuery? Если да, то есть ли лучший способ сделать это?
ОБНОВИТЬ:
Проблема, по-видимому, в том, что нет никакого способа определить, потерял ли DIV фокус, поскольку он никогда не может иметь фокус. Моя логика решения заключалась в том, чтобы увидеть, было ли что-то ДРУГОЕ в фокусе, которое было вне div (следовательно, используя focusin), но я сталкиваюсь с проблемой событий focusin внутри div, которые, по-видимому, всплывают там, вызывая его на теле.
На данный момент я думаю, что мое решение должно состоять в том, чтобы добавить элемент CLOSE во всплывающее окно, а затем заставить людей явно активировать его. Однако это не идеально, особенно для навигации с помощью клавиатуры.