是否有可能重写jquery autocomplete插件的_create函数

时间:2011-12-20 13:32:59

标签: jquery-ui jquery-autocomplete

所有

是否可以覆盖自动完成插件的_create函数?

如果是,那么正确的做法是什么?

由于我遇到的问题,我想过度编写创建函数:

问题:

1.UP和DOWN箭头键

如果是上下箭头键,

autocomplete插件正在使用event.preventDefault();因为这是预防   即使菜单不可见,textarea内的插入符号移动。

2。退出键

在我的情况下,如果我在输入文本区域时按下退出键,我将清除中的文本   文字区域。但是自动完成插件会重置文本区域中键入的值,以防万一   按下退出键。

SO,   你能建议我怎么过写jquery autocomplete插件的_create函数吗?

提前致谢

2 个答案:

答案 0 :(得分:0)

要覆盖_create函数:

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

另一种方法是简单地更改jquery.ui.autocomplete.js的源代码并包含更改的文件。

答案 1 :(得分:0)

嗯,在我看来,如果没有编码,你就无能为力。

但是有一种方法可以限制改变。它取消绑定插件中绑定的原始keydown事件处理程序,并将事件与修改后的处理程序重新绑定(当然基于原始处理程序)。

这不是很复杂,要做到这一点的关键是将保存在元素上的插件实例作为jquery-data与$(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来说明。