Javascript InfoVis工具包:事件在随后导致的函数中返回错误的节点

时间:2018-09-21 18:05:58

标签: infovis

我偶然发现了Javascript InfoVis Toolkit的Spacetree可视化的以下问题:当我用鼠标右键单击一个节点时,随后发生的动作将在与实际单击的子树相同的子树中的不同节点上进行。

这是代码的相关部分:

st = new $jit.ST({

    Events: {  
        enable: true,
        onRightClick: function(node, eventInfo, e) {
            console.log(eventInfo); // line 87
            console.log(e); // line 88
            if (node != undefined) {
                console.log(node.id); // line 90
                if (removedNodes.indexOf(node.data.uniqueId)>-1) {
                    console.log(node.id, " has been restored");
                    removedNodes.splice(removedNodes.indexOf(node.data.uniqueId),1);
                } else {
                    console.log(node.id, " has been deleted"); // line 95
                    removedNodes.push(node.data.uniqueId);
                }
                localStorage.setItem("removedNodes", JSON.stringify(removedNodes));
                loadNewTree(currentTreeId, true, 0)
            }
        },
    },
    /* further code */
}

如您所见,我将事件信息和目标节点的节点ID放入控制台输出(上面的代码段中标记了相关的行号)。这是针对错误节点的情况的控制台输出:

Console output from thee code above

我一直在解决这个问题,看不到可能出了什么问题。如果频繁(但并非总是如此)单击同一子树中的节点,则该问题大约每十次单击发生一次。

感谢您的输入!

1 个答案:

答案 0 :(得分:1)

找到了解决该问题的方法:直接从事件中获取节点ID:

let Node = st.graph.getNode(e.target.attributes.id.nodeValue);

,然后使用新定义的节点,而不是行为异常的节点。