Похоже, что событие 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), которое срабатывает перед размытием?