Захватите клавишу Enter, но не при выборе предложения автоматического заполнения браузера

Я всегда пишу закрывающий тэг для php файлов, и целеустремленно не следую за ним с пробелами или eol.

стандарт подразумевает, что, если закрывающий тэг опущен, каждый будет неявно предоставлен. Но это не реабилитирует разработчика от записи надлежащего html/xml.

И могут быть случаи, где два файла объединены за пределами обработки html/php, и недостающий тег вызвал бы экстремальное горе.

11
задан teedyay 30 October 2009 в 10:21
поделиться

4 ответа

Пользователь всегда должен нажимать клавишу "вниз", если он выбирает один из правых текстов автозаполнения, почему бы не установить переменную на что-то, когда они нажимают клавишу вниз, а затем, если они нажмите Enter, после чего проверьте переменную. Вы не должны использовать функцию щелчка по ссылке, если переменная установлена, в противном случае сделайте это как обычно.

5
ответ дан 3 December 2019 в 04:13
поделиться

Попробуйте отключить автозаполнение в вашем поле, хотя это не стандартно для всех браузеров, но работает в обычных браузерах.

<input type="text" autocomplete="off" />
3
ответ дан 3 December 2019 в 04:13
поделиться

Я не уверен, перехватываете ли вы нажатия клавиш в окне или на определенных элементах DOM. Вы должны сделать последнее (например, в элементе формы ), а затем в обработчике событий заглянуть в объект события, чтобы определить, какой элемент DOM был источником события. Если это текстовое поле с автозаполнением, то return false; .

Взгляните на обработчик событий jQuery .keypress () и event.target свойство объекта события.

0
ответ дан 3 December 2019 в 04:13
поделиться

Используя идею tuanvt в принятом ответе, я написал плагин jQuery, который выполняет эту работу.

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

Я гарантирую, что мы применяем эти правила только к текстовым полям: все остальные элементы ввода работают нормально.

Opera уже неплохо справляется с тем, чего я пытался достичь, поэтому Я не применяю свои правила в этом браузере - иначе пользователю пришлось бы дважды нажать клавишу ВВОД.

Протестировано в IE6, IE7, IE8, Firefox 3.5.5, Google Chrome 3.0, Safari 4.0.4, Opera 10.00.

Это доступны на jquery.com как плагин SafeEnter . Для вашего удобства код для версии 1.0 выглядит следующим образом:

// jQuery plugin: SafeEnter 1.0
// http://plugins.jquery.com/project/SafeEnter
// by teedyay
//
// Fires an event when the user presses Enter, but not whilst they're in the browser's autocomplete suggestions

//codesnippet:2e23681e-c3a9-46ce-be93-48cc3aba2c73
(function($)
{
    $.fn.listenForEnter = function()
    {
        return this.each(function()
        {
            $(this).focus(function()
            {
                $(this).data('safeEnter_InAutocomplete', false);
            });
            $(this).keypress(function(e)
            {
                var key = (e.keyCode ? e.keyCode : e.which);
                switch (key)
                {
                    case 13:
                        // Fire the event if:
                        //   - we're not currently in the browser's Autocomplete, or
                        //   - this isn't a textbox, or
                        //   - this is Opera (which provides its own protection)
                        if (!$(this).data('safeEnter_InAutocomplete') || !$(this).is('input[type=text]') || $.browser.opera)
                        {
                            $(this).trigger('pressedEnter', e);
                        }
                        $(this).data('safeEnter_InAutocomplete', false);
                        break;

                    case 40:
                    case 38:
                    case 34:
                    case 33:
                        // down=40,up=38,pgdn=34,pgup=33
                        $(this).data('safeEnter_InAutocomplete', true);
                        break;

                    default:
                        $(this).data('safeEnter_InAutocomplete', false);
                        break;
                }
            });
        });
    };

    $.fn.clickOnEnter = function(target)
    {
        return this.each(function()
        {
            $(this)
                .listenForEnter()
                .bind('pressedEnter', function()
                {
                    $(target).click();
                });
        });
    };
})(jQuery);
9
ответ дан 3 December 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: