无法显示上下文菜单

时间:2014-09-12 05:37:22

标签: javascript jquery html ajax contextmenu

我的桌子为::

<table>
    <tbody role="rowgroup">
    <tr class="k-alt" data-uid="969dc7e1-0267-46c5-b9ec-b576ba97efc8" role="row">
        <td class="CIDNoInvoiceNo" data-consolidatedinvoicedispatchid="173" data-customerid="548" oncontextmenu="GetTemplateDetails(this,548);return false;" role="gridcell" id="DispatchManagement_active_cell">
            Test
        </td>
    </tr>
    </tbody>
</table>

在表格的单元格(带有classname = CIDNoInvoiceNo)的位置,我想使用上下文菜单。

我做过一些尝试,比如::

function GetTemplateDetails(self,CustomerID)
    {
            var ConsolidatedInvoiceDispatchID = $(self).attr('data-consolidatedinvoicedispatchid');

            var CurrentRowID = $(self).closest('tr').attr("data-uid");

            //POST AJAX to get Template Details
            $.ajax({
                type: 'POST',
                url: rootUrl("Dispatch/GetConsolidatedInvoiceDispatchDocuments"),
                data: { ConsolidatedInvoiceDispatchID: ConsolidatedInvoiceDispatchID, CustomerID: CustomerID },
                success: function (data) {
                    var dataObjectForItems = [];

                    for (var i = 0; i < data.length; i++) {
                        dataObjectForItems["data" + i] = {   name: data[i].Description };
                    }

                    $.contextMenu({
                        selector: "tr[data-uid="+ CurrentRowID +"]>.CIDNoInvoiceNo",
                        callback: function (key, options) {
                            var m = "clicked: " + options.items[key].name;
                            window.console && console.log(m) || alert(m);
                        },
                        items: dataObjectForItems
                    });

                }
            });


            return false;

    } 

使用这个我从服务器端获取上下文,但无法在右键单击显示数据。

1 个答案:

答案 0 :(得分:0)

根据jQuery contextMenu's documentation/demo,它希望将对象作为items属性传递。您当前正在传递一个数组,您正在尝试创建字符串键...数组不应该在JavaScript中以这种方式使用,它们应该仅用于数字索引,如果您想要迂腐,则线性索引从零开始关于优化。如果您希望使用字符串键,则应切换到使用Object。

所以而不是使用:

var dataObjectForItems = [];

您应该使用:

var dataObjectForItems = {};

举例说明为什么不能将字符串键设置为数组:

var a = [];

a[0] = 1;
a[1] = 2;
a[2] = 3;

a['string'] = 4;

console.log(a);

以上的输出将是:

[1, 2, 3]

您会发现'string'已添加为属性,而不是数组中的元素。您可以通过记录数组的长度来确认这一点,该长度仍然只有3而不是4。

Example Fiddle illustrating string keys on arrays

但是,如果切换到使用对象,则添加的每个键都将被视为(或转换为)字符串。这似乎是jQuery contentMenu所期望的;这样每个菜单项都有一个命名标识符,这是你的代码设置字符串键所需要的。


但是请等一下......

  

如果将键添加为属性,那么它肯定与对象相同吗?

如果jQuery contextMenu使用for i in循环来导航项目然后是,使用数组或对象将没有区别(只要数组本身没有实际元素)。尽管如此依赖这种可能性并不是一个好主意,因为你基本上是在滥用数组。但是,这不是在这个例子中发生的事情,因为我们正在谈论一个jQuery插件 - 显然插件正在使用第937行的jQuery.each

// create contextMenu items
$.each(opt.items, function(key, item){

这将检测到opt.items是一个数组,并相应地对其进行处理,这意味着它只会遍历数组元素而不是属性;对于你的数组dataObjectForItems来说意味着没有什么可以介入的。