【问题标题】:How to add toggle button from jqgrid toolbar to autogenerated context menu如何将 jqgrid 工具栏中的切换按钮添加到自动生成的上下文菜单
【发布时间】:2012-01-18 15:09:27
【问题描述】:

jqgrid 顶部工具栏中的切换按钮是使用 Oleg answer as 定义的

var autoedit;
$("#grid_toppager_left table.navtable tbody tr").append(
    '<td class="ui-pg-button ui-corner-all" >' +
        '<div class="ui-pg-div my-nav-checkbox">' +
        '<input tabindex="-1" type="checkbox" id="AutoEdit" '+(autoedit ? 'checked ' : '')+'/>' +
        '<label title="Toggle autoedit" for="AutoEdit">this text is ignored in toolbar</label></div></td>'
);
$("#AutoEdit").button({
    text: false,
    icons: {primary: "ui-icon-star"}
}).click(function () {
    autoedit = $(this).is(':checked');
});

how to add standard textbox command to jqgrid context menu 的答案用于从工具栏自动生成网格的上下文菜单。

在为该项目生成的上下文菜单中,仅显示“此文本在工具栏中被忽略”的文本,选择它不会执行任何操作。

如何使它工作或从上下文菜单中删除此项目?

【问题讨论】:

    标签: jqgrid


    【解决方案1】:

    查看the demo 或具有其他主题的相同演示:thisthis

    首先我修改了jquery.contextmenu.js 的代码以支持jQuery UI 主题。然后我对代码进行了更多修改,以便能够更动态地创建上下文菜单。在jquery.contextmenu.js 的修改版本中,可以创建菜单和绑定不仅在onContextMenu 中,而且在onShowMenu 中。在onContextMenu 内部可以只创建空菜单

    <div id="myMenu"><ul></ul></div>
    

    只有在导航栏中使用动态切换按钮文本图标时才重要。

    您可以下载文件here的修改版。

    在演示中,我使用了来自the answer 的代码的最后修改,因此标准上下文菜单仍然可以在选定文本的网格或启用的输入/文本区域字段中使用。案例中会显示浏览器的上下文菜单:

    我将createContexMenuFromNavigatorButtons函数的代码从the answer修改为如下:

    var getSelectedText = function () {
            var text = '';
            if (window.getSelection) {
                text = window.getSelection();
            } else if (document.getSelection) {
                text = document.getSelection();
            } else if (document.selection) {
                text = document.selection.createRange().text;
            }
            return typeof (text) === 'string' ? text : text.toString();
        },
        createContexMenuFromNavigatorButtons = function (grid, pager) {
            var menuId = 'menu_' + grid[0].id, menuUl = $('<ul>'),
                menuDiv = $('<div>').attr('id', menuId);
    
            menuUl.appendTo(menuDiv);
            menuDiv.appendTo('body');
    
            grid.contextMenu(menuId, {
                bindings: {}, // the bindings will be created in the onShowMenu
                onContextMenu: function (e) {
                    var p = grid[0].p, i, lastSelId, $target = $(e.target),
                        rowId = $target.closest("tr.jqgrow").attr("id"),
                        isInput = $target.is(':text:enabled') ||
                        $target.is('input[type=textarea]:enabled') ||
                        $target.is('textarea:enabled');
                    if (rowId && !isInput && getSelectedText() === '') {
                        i = $.inArray(rowId, p.selarrrow);
                        if (p.selrow !== rowId && i < 0) {
                            // prevent the row from be unselected
                            // the implementation is for "multiselect:false" which we use,
                            // but one can easy modify the code for "multiselect:true"
                            grid.jqGrid('setSelection', rowId);
                        } else if (p.multiselect) {
                            // Edit will edit FIRST selected row.
                            // rowId is allready selected, but can be not the last selected.
                            // Se we swap rowId with the first element of the array p.selarrrow
                            lastSelId = p.selarrrow[p.selarrrow.length - 1];
                            if (i !== p.selarrrow.length - 1) {
                                p.selarrrow[p.selarrrow.length - 1] = rowId;
                                p.selarrrow[i] = lastSelId;
                                p.selrow = rowId;
                            }
                        }
                        return true;
                    } else {
                        return false; // no contex menu
                    }
                },
                onShowMenu: function (e, $menu) {
                    var options = this, $menuUl = $menu.find('ul:first').empty();
    
                    $('table.navtable .ui-pg-button', pager).each(function () {
                        var $spanIcon, text, $td, id, $li, $a, button,
                            $div = $(this).children('div.ui-pg-div:first'),
                            gridId = grid[0].id;
    
                        if ($div.length === 1) {
                            text = $div.text();
                            $td = $div.parent();
                            if (text === '') {
                                text = $td.attr('title');
                            }
                            if (this.id !== '' && text !== '') {
                                id = 'menuitem_' + this.id;
                                if (id.length > gridId.length + 2) {
                                    id = id.substr(0, id.length - gridId.length - 1);
                                }
                            } else {
                                // for custom buttons
                                id = $.jgrid.randId();
                            }
                            $li = $('<li>').attr('id', id);
                            $spanIcon = $div.children('span.ui-icon');
                            if ($spanIcon.length > 0) {
                                // standard navGrid button or button added by navButtonAdd
                                $li.append($('<a>')
                                    .text(text)
                                    .prepend($spanIcon.clone().css({
                                        float: 'left',
                                        marginRight: '0.5em'
                                    })));
                                $menuUl.append($li);
                                options.bindings[id] = (function ($button) {
                                    return function () { $button.click(); };
                                }($div));
                            } else {
                                button = $div.children("input").data("button");
                                if (button !== undefined) {
                                    $a = $('<a>')
                                        .text(button.options.label)
                                        .prepend(
                                            $('<label>').addClass("ui-corner-all").css({
                                                float: 'left',
                                                width: '16px',
                                                borderWidth: '0px',
                                                marginRight: '0.5em'//'4px'
                                            }).append(
                                                $('<span>').addClass("ui-button-icon-primary ui-icon " +
                                                    button.options.icons.primary)
                                                    .css({
                                                        float: 'left',
                                                        marginRight: '0.5em'
                                                    })
                                            )
                                        );
                                    $li.append($a);
                                    if (button.type === "checkbox" && button.element.is(':checked')) {
                                        $a.find('label:first').addClass("ui-state-active");
                                    }
                                    $menuUl.append($li);
                                    options.bindings[id] = (function ($button, isCheckbox) {
                                        if (isCheckbox) {
                                            return function () {
                                                if ($button.is(':checked')) {
                                                    $button.siblings('label').removeClass("ui-state-active");
                                                } else {
                                                    $button.siblings('label').addClass("ui-state-active");
                                                }
                                                $button.click();
                                                $button.button("refresh"); // needed for IE7-IE8
                                        };
                                        } else {
                                            return function () { $button.click(); };
                                        }
                                    }(button.element, button.type === "checkbox"));
                                }
                            }
                        }
                    });
                    return $menu;
                }
            });
        },
        autoedit = false;
    

    并在导航栏中的复选按钮中填入仅稍作改动的代码:

    $("#pager_left table.navtable tbody tr").append(
        '<td class="ui-pg-button ui-corner-all">' +
            '<div class="ui-pg-div my-nav-checkbox">' +
            '<input tabindex="-1" type="checkbox" id="AutoEdit" />' +
            '<label title="Checkx caption which should appear as button tooltip"' +
            ' for="AutoEdit">Autoedit</label></div></td>'
    );
    $("#AutoEdit").button({
        text: false,
        icons: {primary: "ui-icon-mail-closed"}
    }).click(function () {
        var iconClass, $this = $(this);
        if (!autoedit) { // $this.is(':checked')) {
            autoedit = true;
            iconClass = "ui-icon-mail-open";
        } else {
            autoedit = false;
            iconClass = "ui-icon-mail-closed";
        }
        $this.button("option", {icons: {primary: iconClass}});
    });
    createContexMenuFromNavigatorButtons($grid, '#pager');
    

    更新:另一个演示支持通过新的inlineNav 方法添加的按钮,您可以找到here。此外,我在演示中包含了函数normalizePagers,我用它来改善寻呼机的外观:

    如何查看上下文菜单仅包括导航栏中启用的按钮。

    【讨论】:

    • 谢谢。伟大的。如果上下文菜单在浏览器窗口的底部打开,则它会呈现在浏览器之外。它不可见且不可访问。如何强制它在浏览器中呈现,使其可见且可访问。可以使用其他想法的 jquery 位置小部件吗?
    • @Andrus:contexmenu 的当前实现使用事件对象的pageXpageY 属性作为Web 浏览器窗口中的绝对位置。该事件可在onShowMenu 回调中作为第一个参数访问。例如,如果您将e.pageXe.pageY 属性更改为0,则上下文菜单将准确显示在浏览器窗口的左上角。这种方式可以用来解决你描述的问题。
    • 谢谢。如何强制菜单在点击的位置附近打开,以便大部分菜单始终可见(如果有大量项目,则会出现垂直滚动条)?
    • @Andrus:我又做了一个演示。请参阅我的答案的更新部分。
    • @Andrus:我无法重现您描述的问题。我知道其他一些问题,但都在inlineNav 方法中。例如,您选择行并单击“编辑”按钮,然后选择另一行并单击“保存”或“取消”按钮。该行仍在编辑中。同样的问题存在于如何单击按钮:直接或从上下文菜单中触发按钮。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多