受け入れられた回答にコメントするだけです(直接コメントするのに十分なポイントがありません)。しかし、d3の最新バージョンでは、xとyだけでなく、d3.event.pageXとd3.event.pageYが必要なようです。ここのドキュメントによると。
だから私のコードは(このサイトからのIEの助けを借りて):
.on('contextmenu', function(data, index) {
if (d3.event.pageX || d3.event.pageY) {
var x = d3.event.pageX;
var y = d3.event.pageY;
} else if (d3.event.clientX || d3.event.clientY) {
var x = d3.event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
var y = d3.event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
}
d3.select('#action_div')
.style('position', 'absolute')
.style('left', x + 'px')
.style('top', y + 'px')
.style('display', 'block');
d3.event.preventDefault();
})