Javascript InfoVis 工具包:事件 returns 函数中的错误节点随之而来
Javascript InfoVis Toolkit: Event returns wrong node in function that ensues
我在使用 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输出到控制台输出(上面代码片段中标记的相关行号)。这是针对错误节点的情况的控制台输出:
我被困在这个问题上,看不出哪里出了问题。如果单击同一子树中的节点,则该问题大约每 10 次点击就会出现一次,经常(但不总是!)目标节点是之前单击过的节点。
感谢任何意见!
找到解决问题的 hack:直接从事件中获取节点 ID:
let Node = st.graph.getNode(e.target.attributes.id.nodeValue);
然后使用新定义的节点而不是行为不当的节点。
我在使用 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输出到控制台输出(上面代码片段中标记的相关行号)。这是针对错误节点的情况的控制台输出:
我被困在这个问题上,看不出哪里出了问题。如果单击同一子树中的节点,则该问题大约每 10 次点击就会出现一次,经常(但不总是!)目标节点是之前单击过的节点。
感谢任何意见!
找到解决问题的 hack:直接从事件中获取节点 ID:
let Node = st.graph.getNode(e.target.attributes.id.nodeValue);
然后使用新定义的节点而不是行为不当的节点。