Распространение событий IE не работает должным образом с автозаполнением jQuery/jScrollPane

У меня есть поле ввода текста, в котором используется автозаполнение ajax. Результаты отображаются на панели jScrollPane с вертикальной полосой прокрутки.

У меня возникла проблема, связанная с IE, когда событие размытия поля ввода запускается, когда пользователь щелкает полосу прокрутки в раскрывающемся списке jscrollPane (стрелки вверх и вниз полосы прокрутки генерируются как теги привязки, показанные ниже).

Насколько я понимаю, return false должен остановить распространение события, и я ожидаю, что события mousedown и click оба возвращают false для тегов привязки. Это отлично работает в Firefox и Chrome, но не в IE.

Хотя это не показано ниже, я также пытался использовать следующий код в своем событии, но безрезультатно:

    e.preventDefault ? e.preventDefault() : e.stop();
    e.returnValue = false;
    e.stopPropagation();

Думаю, мой первый вопрос:

Должен ли я ожидать, что остановка распространения одного типа событий фактически остановит распространение других типов событий?

т. е. если запускается событие mousedown, которое возвращает false, предотвратит ли это срабатывание событий размытия или фокусировки?

Как обойти эту проблему, чтобы IE работал так же, как Firefox и Chrome?

var rf = function() { return false; };

$('<a></a>')
    .attr({'href':'javascript:;', 'className':'jScrollArrowUp'})
    .css({'width':settings.scrollbarWidth+'px'})
    .html('Scroll up')
    .bind('mousedown', function()
    {
        currentArrowButton = $(this);
        currentArrowDirection = -1;
        onArrowMouseDown();

        return false;
    })
    .bind('click', rf)

$("#InputBox").blur(function(e) {
    hasFocus = 0;
    if (!config.mouseDownOnSelect) {
        hideResultsNow();
    }

person yogibear    schedule 13.07.2011    source источник


Ответы (2)


Та же проблема для меня только в IE.

После нескольких часов экспериментов и гугления я решил использовать небольшую задержку между событием размытия и действием (скрытием списка). Это дает время для запуска события click. Затем в обработчике событий щелчка вы должны проверить, запланирована ли обработка события задержки размытия, если да, отмените эту обработку.

person Pixus.ru    schedule 31.12.2011

Это с опозданием на 3 года, но я только что обнаружил, что на самом деле есть способ заставить IE ≤ 8 делать то, что e.preventDefault() на mousedown делает в других браузерах (что предотвращает выбор и предотвращает фокус): установите атрибут unselectable ! http://jsbin.com/yagekiji/1

Обратите внимание, что в отличие от всегда предлагаемых обходных путей (включая другой здесь), которые всегда сводятся к setTimeout(function() { thingIDidntWantFocusStolenFrom.focus(); }), это предотвращает фокус от быть украденным целью mousedown в первую очередь!

Что забавно в unselectable, так это то, что оно не наследуется, поэтому его часто упускают из виду в пользу события selectstart (которое всплывает, и e.preventDefault() на котором предотвращает выбор, но не предотвращает фокусировку) или устанавливают на каждый элемент-потомок с обходом дерева (например, ответ StackOverflow, который первым подсказал мне, что это возможно, или Тим серия из почти идентично ответы), но на самом деле вы можете просто установить его на event.target на mousedown.

(Кроме того, билет jQuery: http://bugs.jquery.com/ticket/10345)

person Han Seoul-Oh    schedule 30.04.2014