我的桌子为::
<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;
}
使用这个我从服务器端获取上下文,但无法在右键单击显示数据。
答案 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
来说意味着没有什么可以介入的。