【问题标题】:How do you make an autocomplete SlickGrid Editor using JQuery UI 1.9.2如何使用 JQuery UI 1.9.2 制作自动完成 SlickGrid 编辑器
【发布时间】:2012-12-14 14:54:51
【问题描述】:

我遵循了另一个问题的建议,但它对我不起作用。我正在使用 JQuery 1.8.3 和 JQuery UI 1.9.2

当我按下箭头键时,自动完成不会选择下一个选项。为什么?

我在每个事件处理程序上都尝试过 stopPropagation。我使用过 keypress、keyup、keydown、处理程序。我什至将输入元素包装在父标签中,并将 stopPropagation 放在这些事件上,而箭头键仍然无法在自动完成元素上使用。他们只是试图更改验证器功能随后阻止的单元格。

$input.bind("keydown.nav", function (e) {function AutoCompleteEditor(args) {
        var $input,
                defaultValue,
                scope = this;

        this.init = function () {
                $input = $("<INPUT type=text class='editor-text' />");
                $input.appendTo(args.container)
                        .focus()
                        .select()
                        .autocomplete({
                                delay: 0,
                                minLength: 0,
                                source: args.column.options
                        })
                        .bind("keydown.nav", function (e) {
                                if (e.keyCode === $.ui.keyCode.LEFT || e.keyCode === $.ui.keyCode.RIGHT) {
                                        e.stopImmediatePropagation();
                                        e.stopPropagation();
                                } else if (e.keyCode === $.ui.keyCode.UP || e.keyCode === $.ui.keyCode.DOWN) {
                                        e.stopImmediatePropagation();
                                        e.stopPropagation();
                                }
                        })
        };

        this.destroy = function () {
                $input.autocomplete('destroy');
                $input.remove();
        };

        this.focus = function () {
                $input.focus();
        };

        this.getValue = function () {
                return $input.val();
        };

        this.setValue = function (val) {
                $input.val(val);
        };

        this.loadValue = function (item) {
                defaultValue = item[args.column.field] || "";
                $input.val(defaultValue);
                $input[0].defaultValue = defaultValue;
                $input.select();
        };

        this.serializeValue = function () {
                return $input.val();
        };

        this.applyValue = function (item, state) {
                item[args.column.field] = state;
        };

        this.isValueChanged = function () {
                return (!($input.val() == "" && defaultValue == null)) && ($input.val() != defaultValue);
        };

        this.validate = function () {
                var val = $input.val();
                return {
                        valid: args.column.options.indexOf(val) > -1,
                        msg: null
                };
        };

        this.init();
}

【问题讨论】:

    标签: jquery jquery-ui slickgrid


    【解决方案1】:

    我正在使用 Kendo UI ComboBox 作为一些 SlickGrid 列的编辑器。请检查我为修复键盘导航行为所做的工作。

    首先,创建网格的一些代码和几个辅助函数:

    var data = []; // some data
    var columns = []; // some columns
    var options = {
        editable: true,
        autoEdit: false
    };
    var grid = new Slick.Grid('#myGrid', data, columns, options);
    grid.render();
    
    function editing_keydown(e, args) {
        if (!e.shiftKey && !e.altKey && !e.ctrlKey) {
            if (e.which >= 37 && e.which <= 40) {
                e.stopImmediatePropagation();
            }
        }
    }
    
    function disableGridCellNavigation() {
        grid.onKeyDown.subscribe(editing_keydown);
    };
    
    function enableGridCellNavigation() {
        grid.onKeyDown.unsubscribe(editing_keydown);
    };
    

    然后,editor 代码 中,我在 initdestroy 方法中调用这些函数:

    this.init = function() {
        // initialization stuff
        // last line:
        disableGridCellNavigation();
    };
    
    this.destroy = function () {
        // termination stuff
        // last line:
        enableGridCellNavigation();
    };
    

    您可以将此解决方案作为起点来阐述您的解决方案。

    【讨论】:

    • 请注意,我在任何地方使用.bind("keydown.nav")。我认为将整个编辑器代码放在“绑定”调用中不是一个好主意!我建议将一件事与另一件事分开。
    • 那行不通。箭头键永远不会进入自动完成小部件,因此您无法选择任何建议。不管你将事件绑定到什么,停止传播都是行不通的。
    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多