Chrome и JQuery проблема - PullRequest
       1

Chrome и JQuery проблема

0 голосов
/ 19 января 2011

Это странно, но у меня есть какой-то код автозаполнения, который я настроил, чтобы задействовать его только при вводе знака «@» ... В FireFox он отлично работает. Я набираю один '@', и появляется выпадающий список.

НО ... когда я пытаюсь сделать это в Chrome, требуется два символа "@@", чтобы включить раскрывающийся список.

Что бы это могло быть?

Вот код в операторе switch, который активирует выпадающий список автозаполнения:

            case KEY.ATSIGN:
            clearTimeout(timeout);
            timeout = setTimeout(onChange, options.delay);
            //alert("hi");
            //select.show();
            break;
        default:

            break;

Другое странное поведение заключается в том, что при объявлении состояния предупреждения оно действительно работает, когда я набираю один '@' в Chrome ... Есть идеи, как это исправить? Спасибо!

EDIT

Вот функция onChange, в которой я заменяю знак @ пустым "", чтобы он не отображал и не отправлял символ @ при выборе элемента из раскрывающегося списка

    function onChange(crap, skipPrevCheck) {
    if( lastKeyPressCode == KEY.DEL ) {
        select.hide();
        return;
    }

    var currentValue = $input.val();

    if ( !skipPrevCheck && currentValue == previousValue )
        return;

    previousValue = currentValue;

    currentValue = lastWord(currentValue);
    if ( currentValue.length >= options.minChars) {
        $input.addClass(options.loadingClass);
        if (!options.matchCase)
            currentValue = currentValue.toLowerCase();
            currentValue = currentValue.replace("@","");
            request(currentValue, receiveData, hideResultsNow);
            //alert(currentValue);
    } else {
        stopLoading();
        select.hide();
    }
};

НОВОЕ РЕДАКТИРОВАНИЕ Вы можете видеть, что значение atcii at at установлено здесь как 50

    var KEY = {
    UP: 38,
    DOWN: 40,
    DEL: 46,
    TAB: 9,
    RETURN: 13,
    ESC: 27,
    COMMA: 188,
    PAGEUP: 33,
    PAGEDOWN: 34,
    BACKSPACE: 8,
    ATSIGN: 50
};

Тогда в операторе switch автозаполнение активируется только при нажатии знака @:

        switch(event.keyCode) {

        case KEY.UP:
            event.preventDefault();
            if ( select.visible() ) {
                select.prev();
            } else {
                onChange(0, true);
            }
            break;

        case KEY.DOWN:
            event.preventDefault();
            if ( select.visible() ) {
                select.next();
            } else {
                onChange(0, true);
            }
            break;

        case KEY.PAGEUP:
            event.preventDefault();
            if ( select.visible() ) {
                select.pageUp();
            } else {
                onChange(0, true);
            }
            break;

        case KEY.PAGEDOWN:
            event.preventDefault();
            if ( select.visible() ) {
                select.pageDown();
            } else {
                onChange(0, true);
            }
            break;

        // matches also semicolon
        case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
        case KEY.TAB:
        case KEY.RETURN:
            if( selectCurrent() ) {
                // stop default to prevent a form submit, Opera needs special handling
                event.preventDefault();
                blockSubmit = true;
                return false;
            }
            break;

        case KEY.ESC:
            select.hide();
            break;
        case KEY.ATSIGN:
            clearTimeout(timeout);
            timeout = setTimeout(onChange, options.delay);
            //alert("hi");
            //select.show();
            break;
        default:

            break;
    }

А вот функция onChange, которая вызывается в операторе case после нажатия @

    function onChange(crap, skipPrevCheck) {
    if( lastKeyPressCode == KEY.DEL ) {
        select.hide();
        return;
    }

    var currentValue = $input.val();

    if ( !skipPrevCheck && currentValue == previousValue )
        return;

    previousValue = currentValue;
    //alert(previousValue);
    currentValue = lastWord(currentValue);
    if ( currentValue.length >= options.minChars) {
        $input.addClass(options.loadingClass);
        if (!options.matchCase)
            currentValue = currentValue.toLowerCase();
            currentValue = currentValue.replace("@","");
            //alert(currentValue);
            request(currentValue, receiveData, hideResultsNow);

    } else {
        stopLoading();
        select.hide();
    }
};

Как я уже говорил, это отлично работает в FF ... Я нажимаю @ один раз, и автозаполнение активируется ... Однако в Chrome я должен нажать @@ (дважды) ...

Также здесь есть немного кода прямо перед оператором switch

    // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
$input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
    // a keypress means the input has focus
    // avoids issue where input had focus before the autocomplete was applied
    hasFocus = 1;
    // track last key pressed
    lastKeyPressCode = event.keyCode;

1 Ответ

0 голосов
/ 31 января 2011

Посмотрите на 3-й комментарий по этому вопросу.

jQuery Event Keypress: Какая клавиша была нажата?

Вы можете попробовать использовать keyup вместо нажатия клавиши ипосмотрим, как далеко вы получите.Кроме того, если вы публикуете проблему, лучше убрать весь не относящийся к делу код и свести вашу проблему к минимуму.

, вы также можете макетировать быстрый пример на что-то вроде http://jsbin.com/

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