Можно ли перезаписать функцию _create плагина автозаполнения jquery - PullRequest
2 голосов
/ 20 декабря 2011

Все

Можно ли перезаписать _создать функцию плагина автозаполнения?

Если так, каков правильный подход?

Я хочу перезаписать создатьфункция из-за проблем, с которыми я столкнулся:

проблемы:

1. Клавиши со стрелками ВВЕРХ и ВНИЗ

В случаеклавиши со стрелками вверх и вниз,

плагин автозаполнения имеет event.preventDefault ();Из-за этого он предотвращает перемещение каретки внутри текстовой области, даже если меню не отображается.

2.Клавиша Escape

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

Итак, вы можете мне предложить, как перезаписать функцию _create плагина автозаполнения jquery?

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

Ответы [ 2 ]

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

Ну, на мой взгляд, мало что можно сделать без грязного кодирования.

Хотя есть способ ограничить изменение.Он состоит в том, чтобы отменить привязку исходного обработчика событий keydown, связанного с плагином, и повторно связать событие с вашим измененным обработчиком (основанным, конечно, на исходном).

Это не очень сложно, ключ для выполненияэто чтобы получить экземпляр плагина, который сохраняется на элементе в виде jquery-данных с $(this).data('autocomplete');

Вот код:

$('#myinput').autocomplete({ ... })
    .unbind("keydown.autocomplete")
    .bind("keydown.autocomplete", function(event) {

        // obtain the plugin instance
        var self = $(this).data('autocomplete');

        if (self.options.disabled || self.element.propAttr("readOnly")) {
            return;
        }

        suppressKeyPress = false;
        var keyCode = $.ui.keyCode;
        switch (event.keyCode) {
        case keyCode.PAGE_UP:
            self._move("previousPage", event);
            break;
        case keyCode.PAGE_DOWN:
            self._move("nextPage", event);
            break;
        case keyCode.UP:
            self._move("previous", event);

            // disable the prevent
            // event.preventDefault();

            break;
        case keyCode.DOWN:
            self._move("next", event);

            // disable the prevent
            // event.preventDefault();

            break;
        case keyCode.ENTER:
        case keyCode.NUMPAD_ENTER:
            // when menu is open and has focus
            if (self.menu.active) {
                // #6055 - Opera still allows the keypress to occur
                // which causes forms to submit
                suppressKeyPress = true;
                event.preventDefault();
            }
            //passthrough - ENTER and TAB both select the current element
        case keyCode.TAB:
            if (!self.menu.active) {
                return;
            }
            self.menu.select(event);
            break;
        case keyCode.ESCAPE:

            // clear the input value on ESC
            self.element.val('');

            self.close(event);
            break;
        default:
            // keypress is triggered before the input value is changed
            clearTimeout(self.searching);
            self.searching = setTimeout(function() {
                // only search if the value has changed
                if (self.term != self.element.val()) {
                    self.selectedItem = null;
                    self.search(null, event);
                }
            }, self.options.delay);
            break;
        }
    });

Вот jsfiddle для иллюстрации.

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

Чтобы перезаписать функцию _create:

$.ui.autocomplete.prototype._create = function () {
    // new create function
}

Альтернативой является простое изменение исходного кода jquery.ui.autocomplete.js и включение измененного файла.

...