D3的鼠标坐标相对于父元素

Pat*_*ryk 12 javascript mouse coordinates d3.js

我想获得相对于父级或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)
Run Code Online (Sandbox Code Playgroud)

我的代码:

.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);
});
Run Code Online (Sandbox Code Playgroud)

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

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

小智 44

d3.mouse期望DOM元素,而不是d3选择.

d3.mouse(d3.select('body').node())
Run Code Online (Sandbox Code Playgroud)

当然,选择身体可以更容易:

d3.mouse(document.body)
Run Code Online (Sandbox Code Playgroud)

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

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

nodeEnter.on('click', function(d){
  var coordinates = d3.mouse(svg.node());
});
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案 - 让我们假装它被选中了. (13认同)

小智 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");
    });
Run Code Online (Sandbox Code Playgroud)

  • 只是好奇为什么-28? (2认同)
  • @ Angular_10只是另一个魔术数字:)而且pageX和pageY不会给出相对于容器的ua结果。 (2认同)