Это похоже на правильное поведение в Chrome 5.0.375.23 , однако я бы немного изменил его, чтобы иметь согласованное поведение во всех браузерах, включая Chrome 4, поскольку focusout
не обязательно является допустимым событие в элементе, который не может иметь focus
в первую очередь. Лучший подход здесь состоит в том, чтобы воспользоваться преимуществами всплытия и порядка событий. Для этого вы должны заменить это:
jQuery('.popup').live("focusout", function() {
jQuery('.popup').fadeTo(500, 0.0, function() {
jQuery('.popup').css('visibility', 'hidden');
jQuery('.popup').css('opacity', '1.0');
});
});
С этим:
jQuery('.popup, .trigger').live('click', function(e) {
e.stopImmediatePropagation()
});
jQuery(document).click(function() {
jQuery('.popup:visible').fadeTo(500, 0.0, function() {
jQuery(this).css('visibility', 'hidden').css('opacity', '1.0');
});
});
Что происходит, если click
возник внутри всплывающего элемента или триггера (открывая его), действие скрытия не выполняется, поскольку выполнение обработчиков этого события для одного и того же элемента (document
) предотвращено (как пузырь, но это не имеет значения в приведенном выше коде). Даже если .live()
живет в документе, с помощью event.stopImmediatePropagation()
вы можете запретить выполнение обработчиков того же уровня, если они были связаны позже, так как обработчики выполняются в том порядке, в котором они были связаны.
В качестве отступления от .stopPropgation()
:
Если вы измените это значение на event.stopPropagation()
, другой обработчик все равно выполнится, скрывая всплывающее окно (хотя вы можете использовать event.stopProgation()
и проверить event.isPropogationStopped()
во втором обработчике).