我正在使用d3.geo.zoom.js library并且它正在做我想要的事情,除非如果有人双击它会引发错误,然后导致地球冻结并停止响应用户输入。我重新下载了该项目并且未经修改地运行它并得到了同样的错误。
以下是我的实施:codeasart.com/globe
可以通过双击轻松复制的错误是:
(index):108 Uncaught TypeError: Cannot read property 'preventDefault' of null
at SVGPathElement.<anonymous> ((index):108)
at SVGPathElement.t (d3.v3.min.js:1)
at SVGPathElement.<anonymous> (d3.geo.zoom.js:29)
at SVGPathElement.t (d3.v3.min.js:1)
at d3.v3.min.js:1
at c (d3.v3.min.js:3)
at SVGPathElement.<anonymous> (d3.v3.min.js:3)
at a (d3.v3.min.js:3)
at Object.c (d3.v3.min.js:3)
at Rn (d3.v3.min.js:1)
错误中显示的第一行索引:108是:
d3.event.sourceEvent.preventDefault();
我尝试将其放入try / catch块中,但这并没有解决它。
d3本身不是唯一的另一行是d3.geo.zoom.js:29,这是:
event.zoom.apply(this, arguments);
我也尝试使用try / catch块。没有运气。
我只是不太了解javascript / d3事件模型来调试它。有什么帮助吗?
答案 0 :(得分:0)
我不停地对此进行打击(每隔几分钟检查一下是否有人回复)并最终在d3.geo.zoom.js的第18行确定:
point = position(projection, mouse0);
双击时,点为False(而不是两个双精度数组)。
我刚添加一行:
if( !point ) return;
这似乎已经解决了问题。
我会认为这只是一个问题,当开始点和结束点相同时数学会中断,除非如果我在没有使用鼠标的情况下非常慢地点击它就不会导致错误。只有实际的双击。