我遇到一个非常奇怪的问题。我在我的一个网站上使用来自JQueryUI的jsTree,并且我在不同的.js文件中使用了它的不同实现。其中一个似乎工作,这是非常令人困惑的,因为它使用几乎相同的代码(只有变量名称是不同的)与被破坏的实现。问题来自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()函数时,dryList数组就在那里,并且dryerList [0]包含它应该的5个值中的4个 - 但不知何故,'id'元素已从该对象中删除。我已经看了很长一段时间了,我无法弄清楚如何从对象中删除单个元素而不丢失任何其他数据,特别是当相同的代码用于类似的列表时。有什么建议吗?
答案 0 :(得分:1)
好的,我在你的问题中读到:'和dryerList [0]包含它应该的5个值中的4个 - 但不知何故'id'元素已从该对象中删除了
所以通过'element'和'value'我假设你的意思是'属性':节点的'id'属性是精确的?
我在您的代码中看到:var id = node[0].id;
那应该是:var id = node[0].getAttribute("id");
更新1:
好吧,如果(根据你的评论)var id = node[0].id;
(从节点[0]获取id)没问题,那么if(id == dryerList[i].id)
看起来不对,因为你只是(重新)定义了id为节点的值[0]的身份。
实际上我不会使用'id'作为var-name(在这种情况下)。
那么如果你这样做了:var idc = node[0].getAttribute("id");
然后:if(idc === dryerList[i].getAttribute("id"))
更新5:顺便说一下,您仍然遇到一些错误:
if(dryerList.length == 0) {
alert('ERROR: No fleet data received.')
}
var dryerList = dryerList || []; if(dryerList.length === 0){//ajax & json code}
如果this fiddle,现在有效javascript ,代表您仍然会产生的基线代码,请确认在您的问题中,在烘焙列表的节点集合中'id'属性为'未定义'(因为您发布的代码包含一些在此jsfiddle中修复的简单错误,排除更新1中提到的内容,既然你评论说这不是问题)?
我可以问(因为你从document.ready开始),你为什么(仍然)检查烘干机列表是否已经存在?
请问您是否可以通过一些演示数据来更新那个经过纠正的小提示,以便我们玩弄它?