【发布时间】:2012-08-08 16:39:43
【问题描述】:
我遇到了一个非常奇怪的问题。我在我的一个站点上使用来自 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”元素已从该对象中删除。我已经研究了很长时间,但我无法弄清楚它如何在不丢失任何其他数据的情况下从对象中删除单个元素,尤其是当相同的代码适用于类似的列表时。有什么建议吗?
【问题讨论】:
-
您在三个地方使用了全局变量“i”。你真的需要非常小心地在 JavaScript 中使用
var声明你的局部变量。 -
我在多个地方使用它,但只是按顺序使用 - 每次使用时都会重置该变量,并且在重置之前不会再次使用。
-
我同意这可能不是问题,但这是一种冒险的不必要的做法。
-
那么你是说我应该为代码中的每个 for 循环使用唯一的迭代器?
-
如果您知道自己在做什么,据我所知,没有理由不重用 i 来计算您的迭代次数。只是不要嵌套它们!但是,您可能还想认真优化您的循环。不要在每次迭代时都得到dryerList.length!!!也做反向循环: i=dryerList.length; while(i--){//actions} 尽可能!
标签: javascript jquery-ui jstree