Javascript 无法显示关联菜单
我的桌子是::Javascript 无法显示关联菜单,javascript,jquery,html,ajax,contextmenu,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" oncon
<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;
}
函数GetTemplateDetails(self,CustomerID)
{
var ConsolidatedInvoiceDispatchID=$(self.attr('data-ConsolidatedInvoiceDispatchID');
var CurrentRowID=$(self).closest('tr').attr(“数据uid”);
//发布AJAX以获取模板详细信息
$.ajax({
键入:“POST”,
url:rootUrl(“Dispatch/GetConsolidatedInvoiceDispatchDocuments”),
数据:{ConsolidatedInvoiceDispatchID:ConsolidatedInvoiceDispatchID,CustomerID:CustomerID},
成功:功能(数据){
var dataObjectForItems=[];
对于(变量i=0;i.CIDNoInvoiceNo”,
回调:函数(键、选项){
var m=“单击:”+选项。项[键]。名称;
window.console&&console.log(m)| | alert(m);
},
items:dataObjectForItems
});
}
});
返回false;
}
使用此选项,我可以从服务器端获取上下文,但无法在右键单击中显示数据。根据,它希望将对象作为items属性传递。您当前正在传递一个数组,试图在该数组上创建字符串键。。。数组在JavaScript中不应该以这种方式使用,它们应该只保留给数字索引,如果你想学究式地进行优化,线性索引从零开始。如果希望使用字符串键,则应切换到使用对象
因此,与其使用:
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
但是,如果切换到使用对象,则添加的每个键都将被视为(或转换为)字符串。这似乎是jQueryContentMenu所期望的;因此,每个菜单项都有一个命名标识符,这是代码设置字符串键所需的
但是等一下。。。 如果键被添加为属性,那么肯定与对象相同吗 如果jQuery contextMenu使用
for i in
循环来导航项目,那么是的,使用数组或对象不会有任何区别(只要数组本身没有实际元素)。不过,依赖这种可能性不是一个好主意,因为您实际上是在滥用数组。然而,在本例中并不是这样,因为我们讨论的是一个jQuery插件——显然,该插件正在使用第937行的jQuery.each
// create contextMenu items
$.each(opt.items, function(key, item){
这将检测到
opt.items
是一个数组,并对其进行相应的处理,这意味着它将只遍历数组元素,而不遍历属性;对于您的数组dataObjectForItems
而言,这意味着无需单步执行。console中是否有任何错误?您的选择器是否选择了它应该选择的内容?否没有error@IlyaLuzyanin选择器正确地选择它。返回的数据对象是什么样的结构?循环的for
按摩数据的地方看起来有点古怪。。。具体来说,这一部分dataObjectForItems[“data”+i]
您缺少第二行的data-uid
属性。看看这个@Ratatouille~是的,这会有什么变化?回答您问题的两个用户都在使用对象,而不是数组,这是您应该做的。