Распространение событий IE не работает должным образом с автозаполнением jQuery / jScrollPane - PullRequest
0 голосов
/ 13 июля 2011

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

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

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

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

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

Наверное, мой первый вопрос:

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

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

Как я могу обойти эту проблему, чтобы гарантировать, что IE работает так же, как FF и 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();
    }

Ответы [ 2 ]

0 голосов
/ 30 апреля 2014

Это на 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)

0 голосов
/ 31 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...