jquery focusin() и предотвращение пузырей
ОБНОВЛЕНИЕ 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.
Я думал, что в этом сценарии я могу использовать фокусное событие на теле:
$('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 во всплывающее окно, а затем заставить людей явно вызывать его. Хотя не идеально, особенно для навигации с помощью клавиатуры.
2 ответа
Не было бы проще отобразить 2 деления. Один прозрачный (невидимый) div, который охватывает всю страницу, а другой вы действительно хотите показать. Тогда вам просто нужно установить z-index
правильное тело
Затем зарегистрируйте событие click для невидимого div и при нажатии удалите оба. Законченный. По крайней мере, так работает большинство таких плагинов jquery для модального диалога
Если вы хотите использовать focusin, но не использовать всплывающее окно событий, почему бы вам просто не использовать focus
...?