Javascript数组随机丢失元素

时间:2012-08-08 16:39:43

标签: javascript jquery-ui jstree

我遇到一个非常奇怪的问题。我在我的一个网站上使用来自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'元素已从该对象中删除。我已经看了很长一段时间了,我无法弄清楚如何从对象中删除单个元素而不丢失任何其他数据,特别是当相同的代码用于类似的列表时。有什么建议吗?

1 个答案:

答案 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.') }
  • 您应该使用'==='与第2行和第14行的'0'进行比较
  • 在现实生活中自然会定义函数customBinMenu(节点),然后才能在document.ready函数中使用它。
    通过交换代码顺序修复。
  • 这个document.ready函数也是如此,你在定义之前使用了var dryerList 修正:var dryerList = dryerList || []; if(dryerList.length === 0){//ajax & json code}

如果this fiddle现在有效javascript ,代表您仍然会产生的基线代码,请确认在您的问题中,在烘焙列表的节点集合中'id'属性为'未定义'(因为您发布的代码包含一些在此jsfiddle中修复的简单错误,排除更新1中提到的内容,既然你评论说这不是问题)?

我可以问(因为你从document.ready开始),你为什么(仍然)检查烘干机列表是否已经存在?
请问您是否可以通过一些演示数据来更新那个经过纠正的小提示,以便我们玩弄它?