Хлоп.Tricky.Да, происходит следующее:
mousedown
: старый элемент формы получает событие blur
.$(':focus').length == 0
. mouseup
: новый элемент формы получает событие focus
.$newFormElement.is(':focus') == true
.
Это улучшение:
$('#tracker').focusout(function() //basically like $('#tracker, #tracker *').blur(), but "this" is always '#tracker'
{
if(!$(this).is('#tracker:hover')) //for some reason plain old :hover doesn't work, at least on the latest OS X Chrome
hideTracker();
});
Но оно не идеально.Это действительно работает, только если вы используете мышь.Если вы используете вкладку для перемещения между полями (или каким-либо другим возможным механизмом), когда ваша мышь не находится над #tracker
, она не будет работать.
Вот еще одна попытка.Это немного ... хакерски.Суть в том, что вместо обработки события blur
вы обрабатываете событие focus
для второй вещи, которая сфокусирована.Но!Что если вы нажмете на то, что не может быть сфокусировано?Пустое место на вашей странице?Тогда событие focus
не запускается.
Хорошо.Итак, хитрость заключается в следующем: поместите tabindex="0"
в корневой тег <html>
.Это означает, что всегда есть что-то , которое можно сфокусировать.Так что нет возможности сосредоточиться ни на чем (по крайней мере, я так не думаю).
Тогда вы можете сделать это:
$('*').live('focus', function(e)
{
if(!$.contains($('#tracker')[0], this)) //if the new thing you focused on is not a descendant of #tracker
hideTracker();
e.stopPropagation();
});
Э?Так что да, это сертифицированный хак.Но это сложная проблема, и это лучшее, что я могу придумать в этот час.