Как можно предотвратить последующую привязку к автозаполнению jQuery? - PullRequest
1 голос
/ 18 мая 2009

Код ниже очень прост. У меня есть jQuery автозаполнение , привязанный к вводу текста html, на который ссылается #search. Когда пользователь что-то вводит в него, в выпадающем списке отображаются предложения от сервера. Если пользователь нажимает на одно из предложений или нажимает клавишу Enter, когда оно выбрано, появляется всплывающее окно (facebox), показывающее вызываемую страницу внутри всплывающего окна. Если вместо этого пользователь просто хочет выполнить обычный поиск и не выбрать предложение, он может сделать это, нажав Enter или нажав #searchButton. Другими словами:

  1. Пользователь вводит что-то, например, грейпфрут
  2. Появляются выбираемые предложения.
  3. Сценарий 1: пользователь выбирает предложение с помощью мыши или клавиатуры, нажимает ввод или щелкает по нему - вызывая это элемент для всплывающего окна, то есть автозаполнение результат. Handler срабатывает (а не .keypress)
  4. Сценарий 2: пользователь не заинтересован в предложениях, а вместо прессов введите ИЛИ нажмите #searchButton, чтобы выполнить полный поиск того, что он набрал в #search. Обработчик результатов автозаполнения не запускается, вместо этого либо нажатие клавиши Enter инициирует событие нажатия #searchButton, либо оно запускается напрямую (т.е. фактически щелкается), вызывая тем самым обычный поиск.

Это прекрасно работает в IE6, IE7, IE8, Chrome, Safari, но НЕ в Firefox.

В firefox, когда нажата клавиша «Enter» для предложения, и обработчик результатов, и события нажатия клавиш запускаются, давая пользователю всплывающее окно с лицевой панелью, а также выполняют полный поиск. Я подумал, что каким-то образом остановка .keypress от стрельбы, если. result пожары, добьется цели, однако я не смог понять, как это сделать. Я пытался поместить с помощью jQuery stopPropogation() и stopImmediatePropogation() в обработчик .result в надежде, что это предотвратит запуск .keypress, но это ничего не изменило.

Если у кого-то возникнут какие-либо мысли или я хотел бы помочь мне в этом, я был бы очень признателен.

Заранее спасибо!

    jQuery("#search").autocomplete("/index/suggest", {
        selectFirst: false,
        formatItem: function(data, i, n, value) {
            return "<font color='#3399CC'>" + value.split("::")[0] + "</font>";
        },
        formatResult: function(data,value) {
            return value.split("::")[0];
        }
    }).result(function(event, data, formatted) {
        alert('Hello, someone selected a suggestion by clicking on it or pressing enter on it, so you\'re getting this!');
        var pieces = formatted.split("::");
        var url = '/' + pieces[1] + '/detail/?id=' + pieces[2];
        jQuery.facebox({ ajax: url });
    }).keypress(keypressHandler).blur(function() {
        alert('I don\'t want this to appear if .result above is called, and it doesnt, except in firefox! Bah!');
        jQuery(this).flushCache();
    });

    function keypressHandler(e)
    {
        if(e.which == 13) {
            if(!jQuery('#searchButton').is(':disabled')) {
                jQuery(this).blur();
                jQuery('#searchButton').focus().click();
            }
        }
    }

Ответы [ 2 ]

3 голосов
/ 18 мая 2009

Вы пытались отменить привязку события нажатия клавиши только в окне поиска и повторно привязать свой собственный обработчик нажатия клавиши?

jQuery("#search").autocomplete("/index/suggest", {
    selectFirst: false,
    formatItem: function(data, i, n, value) {
        return "<font color='#3399CC'>" + value.split("::")[0] + "</font>";
    },
    formatResult: function(data,value) {
        return value.split("::")[0];
    }
}).result(function(event, data, formatted) {
    alert('Hello, someone selected a suggestion by clicking on it or pressing enter on it, so you\'re getting this!');
    var pieces = formatted.split("::");
    var url = '/' + pieces[1] + '/detail/?id=' + pieces[2];
    jQuery.facebox({ ajax: url });
});

jQuery("#search").unbind("keypress").keypress(keypressHandler).blur(function() {
    alert('I don\'t want this to appear if .result above is called, and it doesnt, except in firefox! Bah!');
    jQuery(this).flushCache();
});

Также может быть, что есть другие ключевые события, которые обрабатываются вместо этого в обработчике автозаполнения. Я думаю, что вы хотели бы удалить все из текста, оставляя их в «списке» автозаполнения. Если события, обрабатываемые автозаполнением, отличаются от нажатия клавиш, вы можете вместо этого удалить их.

0 голосов
/ 18 мая 2009

В JavaScript вы можете просто:

return false;

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

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