私が遭遇している非常に奇妙な問題があります。私は自分のサイトの 1 つで JQueryUI の jsTree を使用しており、さまざまな .js ファイルでさまざまな実装を使用しています。そのうちの 1 つが機能しているように見えますが、壊れている実装とほぼ同じコード (変数名のみが異なる) を使用しているため、非常に混乱しています。問題は contextmenu 機能から来ています。私が使用しているコードは次のとおりです。
$(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」要素がそのオブジェクトから削除されています。私はこれをかなり長い間見てきましたが、特に同じコードが同様のリストに対して機能している場合、他のデータを失うことなくオブジェクトから単一の要素を削除する方法を理解できません。助言がありますか?