13

我想获取相对于父级或 DOM 中任何其他元素的鼠标坐标,this但我一直在获取

Uncaught TypeError: Object [object Array] has no method 'getBoundingClientRect' d3.v3.min.js:1
H d3.v3.min.js:1
vo.mouse d3.v3.min.js:3
(anonymous function) index.html:291
(anonymous function)

我的代码:

.on("mouseup", function(d){
    var th = d3.select( this );

    var coordinates = [0, 0];
    coordinates = d3.mouse( d3.select("body") );
    console.log( coordinates[1] );
    console.log( window );
    //th.attr("cy", d3.mouse),
    //d.newY = th.attr("cy");
    console.log(d);
});

据我所知,我只能获得相对于我附加了.on("mouseup", ...)事件侦听器的元素的鼠标坐标。

有没有办法让这些坐标相对于 DOM 中的其他元素?

4

2 回答 2

52

d3.mouse需要一个 DOM 元素,而不是 d3 选择。

d3.mouse(d3.select('body').node())

当然选择body可以更容易:

d3.mouse(document.body)

@Tom 的回答也适用于您的情况,因为您想要相对于页面的位置,但如果您想要相对于其他容器的位置,它就不起作用。

假设您想在用户单击的位置放置一个弹出窗口,并且您希望相对于 svg 元素定位它,以便它与显示的其余部分一起平移。

nodeEnter.on('click', function(d){
  var coordinates = d3.mouse(svg.node());
});
于 2015-06-02T20:45:30.040 回答
5

您可以使用 d3.event.pageX 和 d3.event.pageY。我使用这个的一个例子:

.on("mouseover", function(d){
        hover.transition().duration(200).style("opacity", .9);
        hover.html(new Date(d.creationDate)+": "+d.reactionTime).style("left", d3.event.pageX+"px").style("top", (d3.event.pageY - 28)+"px");
    });
于 2013-09-02T11:12:55.933 回答