【问题标题】:How to create jqGrid Context Menu?如何创建 jqGrid 上下文菜单?
【发布时间】:2011-09-30 06:10:45
【问题描述】:

我正在尝试在 jqGrid 上创建一个上下文菜单(针对每一行),但找不到如何执行此操作。我目前正在使用 jQuery 上下文菜单(有更好的方法吗?)但它适用于整个 Grid不适用于特定行,即无法为其执行行级操作。请帮助我,谢谢。

$(document).ready(function(){ 
  $("#list1").jqGrid({
    sortable: true,
    datatype: "local", 
    height: 250, 
    colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'], 
    colModel:[ 
        {name:'id',index:'id', width:60, sorttype:"int"}, 
        {name:'invdate',index:'invdate', width:90, sorttype:"date"}, 
        {name:'name',index:'name', width:100}, 
        {name:'amount',index:'amount', width:80, align:"right",sorttype:"float"}, 
        {name:'tax',index:'tax', width:80, align:"right",sorttype:"float"}, 
        {name:'total',index:'total', width:80,align:"right",sorttype:"float"}, 
        {name:'note',index:'note', width:50, sortable:false} 
        ], 
    multiselect: true,
    rowNum:10, 
    rowList:[10,20,30], 
    pager: '#pager1', 
    sortname: 'id', 
    recordpos: 'left', 
    viewrecords: true, 
    sortorder: "desc",
    caption: "Manipulating Array Data"
  });
  $("#list1").jqGrid('navGrid','#pager1',{add:false,del:false,edit:false,position:'right'});

  $("#list1").contextMenu({
        menu: "myMenu"
    },
        function(action, el, pos) {
        alert(
            "Action: " + action + "\n\n" +
            "Element ID: " + $(el).attr("id") + "\n\n" +
            "X: " + pos.x + "  Y: " + pos.y + " (relative to element)\n\n" +
            "X: " + pos.docX + "  Y: " + pos.docY+ " (relative to document)"
            );
    });

【问题讨论】:

    标签: jquery jqgrid


    【解决方案1】:

    有很多上下文菜单插件。您可以在 jqGrid 源代码的 plugins 子目录中找到其中的一个。

    要使用它,您可以使用例如以下 HTML 标记来定义上下文菜单:

    <div class="contextMenu" id="myMenu1" style="display:none">
        <ul style="width: 200px">
            <li id="add">
                <span class="ui-icon ui-icon-plus" style="float:left"></span>
                <span style="font-size:11px; font-family:Verdana">Add Row</span>
            </li>
            <li id="edit">
                <span class="ui-icon ui-icon-pencil" style="float:left"></span>
                <span style="font-size:11px; font-family:Verdana">Edit Row</span>
            </li>
            <li id="del">
                <span class="ui-icon ui-icon-trash" style="float:left"></span>
                <span style="font-size:11px; font-family:Verdana">Delete Row</span>
            </li>
        </ul>
    </div>
    

    您可以将上下文菜单绑定到loadComplete 内的网格行(在行放置在&lt;table&gt; 中之后):

    loadComplete: function() {
        $("tr.jqgrow", this).contextMenu('myMenu1', {
            bindings: {
                'edit': function(trigger) {
                    // trigger is the DOM element ("tr.jqgrow") which are triggered
                    grid.editGridRow(trigger.id, editSettings);
                },
                'add': function(/*trigger*/) {
                    grid.editGridRow("new", addSettings);
                },
                'del': function(trigger) {
                    if ($('#del').hasClass('ui-state-disabled') === false) {
                        // disabled item can do be choosed
                        grid.delGridRow(trigger.id, delSettings);
                    }
                }
            },
            onContextMenu: function(event/*, menu*/) {
                var rowId = $(event.target).closest("tr.jqgrow").attr("id");
                //grid.setSelection(rowId);
                // disable menu for rows with even rowids
                $('#del').attr("disabled",Number(rowId)%2 === 0);
                if (Number(rowId)%2 === 0) {
                    $('#del').attr("disabled","disabled").addClass('ui-state-disabled');
                } else {
                    $('#del').removeAttr("disabled").removeClass('ui-state-disabled');
                }
                return true;
            }
        });
    }
    

    在示例中,我为所有具有偶数 rowid 的行禁用了 "Del" 菜单项。禁用的菜单项转发项目选择,因此需要在bindings 内控制是否再次禁用该项目。

    我使用上面的$("tr.jqgrow", this).contextMenu('myMenu1', {...}); 将相同的菜单绑定到所有网格行。您当然可以将不同的行绑定到不同的菜单:$("tr.jqgrow:even", this).contextMenu('myMenu1', {...}); $("tr.jqgrow:odd", this).contextMenu('myMenu2', {...});

    我没有仔细阅读contextMenu 的代码,可能上面的例子不是最好的,但效果很好。可以看对应的demohere。该演示还有许多其他功能,但您应该只查看loadComplete 事件处理程序。

    【讨论】:

    • 太棒了!肯定会在我的 jQGrid 实例中实现这个
    • @FastTrack:我稍后建议在上下文菜单中添加一些附加组件。例如,参见 the demo 来自 the answer 和其他一些。另见the post
    • 应该有一种方法可以在 JqGrid for PHP 中实现这个解决方案。 here 是问题
    • @Oleg - 谢谢!这种方法对我也很有效,但我有一个问题 - ul 元素(“width:200px”)的内联样式规则似乎以某种方式被覆盖。我在您的示例中也看到了这种情况。有什么办法可以解决这个问题? (我的上下文菜单选项更长)
    • @froadie:不客气!答案真的很老了。例如,将conetxMenu 单独绑定 到每个tr.jqgrow 是不好的。最好将事件绑定到&lt;table&gt; 元素一次。此外,现在有一个新版本的 jQuery UI,此外还有两个 jqGrid 分支:我开发的 free jqGrid 和 Tony 开发的 Guriddo jqGrid JSgithub.com/free-jqgrid/jqGrid/tree/master/plugins 中有两个关闭插件。如果您发布包含所有详细信息的单独问题会更好
    【解决方案2】:

    你可以看看 onRightClickRow 事件

    JqGridWiki

    jQuery("#gridid").jqGrid({
    ...
       onRightClickRow: function(rowid, iRow, iCol, e){ 
          //Show context menu ...
    
       },
    ...
    })
    

    来自 Wiki ... onRightClickRow

    活动名称

    onRightClickRow

    参数

    rowid, iRow, iCol, e

    信息

    右键单击行后立即引发。 rowid 是行的id, iRow 是行的索引(不要将它与 rowid 混合), iCol 是单元格的索引。 e 是事件对象。 注意 - 此事件在 Opera 浏览器中不起作用,因为 Opera 不支持 oncontextmenu 事件

    【讨论】:

    • 如何在此处扩展上下文菜单?
    • 如果你能找到一个带有 show() 方法的 contextMenu,你可以在 rightclick 事件中使用它。或者另一种解决方案是创建一个自己的 div 并在用户右键单击该行时调用 $('div').show() ...
    • 所以我猜jqGrid中没有上下文菜单。有一个带有 ContextMenu 的 ASP.NET MVC 代码示例,但我在简单的 jQuery 中找不到它的等价物。 trirand.net/examples/functionality/contextmenu/default.aspx
    • 您可以使用相同的方法.. 1) 为每一行分配一个类 2) 将上下文菜单附加到具有该类的所有 DOM 元素 3) 在 ContextMenu 函数上(action, el, pos)像现在一样获取行数据 ($(el).attr("id"))
    • 我可能需要处理 50 万行(有时)。这种方法会不会有点贵?
    【解决方案3】:

    你可以试试这个:

    jQuery("#yourid").jqGrid({
    

    ...

    {name:'req_name',index:'req_name', width:'9%', sortable:true},
    

    .....

     loadComplete:function(request){
    

    ...

                   $("[aria-describedby='yourid_req_name']", this).contextMenu('myMenu1',{ 
                        onContextMenu: function(e) {
                            var rowId = $(e.target).closest("tr.jqgrow").attr("id");
                                $("#send").html('<a onclick="send_email('+rowId+')">Send Email</a>');
                                return true;    
                        }
                    });
    },
    

    ............ 和html代码:

    <div class="contextMenu" id="myMenu1" style="display:none">
            <ul style="width: 400px">
                <li id="send">
                    <span>Add Row</span>
                </li>
            </ul>
        </div>
    

    【讨论】:

      猜你喜欢
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2014-12-15
      • 2019-05-01
      • 1970-01-01
      相关资源
      最近更新 更多