我遇到了一个非常奇怪的问题。我在我的一个站点上使用来自 JQueryUI 的 jsTree,并且我在不同的 .js 文件中使用了不同的实现。其中一个似乎工作,这非常令人困惑,因为它使用几乎相同的代码(只有变量名不同)到被破坏的实现。问题来自上下文菜单功能。我正在使用的代码如下:
$(document).ready(function () {
if(typeof dryerList == 'undefined' || dryerList.length == 0) {
var dryerList = [];
$.ajax({
url:'../TrackingApp/getGrainBins.php?t=234.23423452353',
async: false,
success: function(text) {
try {
dryerList = $.parseJSON(text);
} catch (e) {
alert('ERROR: ' + e);
}
if(dryerList.length == 0) {
alert('ERROR: No fleet data received.')
}
}
});
}
$("#dryerListTree").jstree({
plugins : ['json_data', 'ui', 'themes', 'contextmenu'],
contextmenu: {items: customBinMenu},
json_data : { data: binNodes }
});
$('#dryerListTree').bind("dblclick.jstree", function (event) {
var node = $(event.target).closest("li");
var id = node[0].id;
for(i=0; i < dryerList.length; i++) {
if(id == dryerList[i].id) {
centerMap(dryerList[i].y, dryerList[i].x);
break;
}
}
});
});
function customBinMenu(node) {
if ($(node).hasClass("folder")) {
return;
}
var items = {
centerItem: {
label: "Locate",
action: function () {
// Centers map on selected bin
var id = node[0].id;
for(i=0; i < dryerList.length; i++) {
if(id == dryerList[i].id) {
centerMap(dryerList[i].y, dryerList[i].x);
break;
}
}
}
},
dashboardItem: {
label: "Dashboard",
action: function () {
// Opens dryer info window over map
var id = node[0].id;
var dryerIndex = -1;
for(i=0; i < dryerList.length; i++) {
if(id == dryerList[i].id) {
dryerIndex = i;
break;
}
}
}
}
};
return items;
}
奇怪的是,双击处理程序工作得很好。当我到达 customBinMenu() 函数时,dryerList 数组就在那里,并且dryerList[0] 包含它应该包含的 5 个值中的 4 个 - 但不知何故,“id”元素已从该对象中删除。我已经研究了很长时间,但我无法弄清楚它如何在不丢失任何其他数据的情况下从对象中删除单个元素,尤其是当相同的代码适用于类似列表时。有什么建议么?