Похоже, что событие Blur прекращает работу обработчика событий кликов? У меня есть поле со списком, в котором параметры отображаются только в том случае, если текстовое поле имеет фокус. Выбор ссылки опции должен вызвать событие.
У меня есть пример скрипки: http://jsfiddle.net/uXq5p/6/
Воспроизведение:
- Выберите текстовое поле
- Появятся ссылки
- Нажмите ссылку
- Размытие даже происходит, и ссылки исчезают
- Ничего другого не происходит.
Ожидаемое поведение:
На шаге 5 после размытия щелчок должен также загореться. Как это сделать?
UPDATE:
Поиграв с этим какое-то время, кажется, что кто-то прошел долгий путь, чтобы предотвратить обработку уже произошедшего события клика, если событие размытия делает элемент clicked Un-clickable.
Например:
$('#ShippingGroupListWrapper').css('left','-20px');
работает отлично, но
$('#ShippingGroupListWrapper').css('left','-2000px');
предотвращает событие click.
Это, кажется, ошибка в Firefox, так как создание элемента un-clickable должно предотвращать клики будущих, но не отменять те, которые уже произошли, когда это может быть щелкнул.
Другие действия, препятствующие обработке события click:
$('#ShippingGroupListWrapper').css('z-index','-20');
$('#ShippingGroupListWrapper').css('display','none');
$('#ShippingGroupListWrapper').css('visibility','hidden');
$('#ShippingGroupListWrapper').css('opacity','.5');
Я нашел несколько других вопросов на этом сайте, которые имеют схожие проблемы. Кажется, что существуют два решения:
-
Используйте задержку. Это плохо, потому что это создает условие гонки между скрытием и обработчиком событий click. Его также неаккуратно.
-
Используйте событие
mousedown
. Но это не отличное решение, так какclick
- правильное событие для ссылки. Поведениеmousedown
противоречит интуиции с точки зрения UX, тем более что вы не можете отменить клик, перемещая мышь от элемента до отпускания кнопки.
Я могу вспомнить еще несколько.
3.Используйте mouseover
и mouseout
в ссылке, чтобы включить/отключить событие размытия для поля. Это не работает с клавиатурой, поскольку мышь не задействована.
4. Лучшим решением будет что-то вроде:
$('#ShippingGroup').blur(function()
{
if($(document.activeElement) == $('.ShippingGroupLinkList'))
return; // The element that now has focus is a link, do nothing
$('#ShippingGroupListWrapper').css('display','none'); // hide it.
}
К сожалению, $(document.activeElement)
, кажется, всегда возвращает элемент body, а не тот, который был нажат. Но, может быть, если бы был надежный способ узнать, что 1. у какого элемента теперь есть фокус или два, этот элемент вызвал размытие (а не размытие элемента) внутри обработчика размытия. Кроме того, есть ли другое событие (кроме mousedown
), которое срабатывает перед размытием?