d3和svg中的自定义上下文菜单

时间:2012-10-26 15:58:05

标签: javascript svg contextmenu d3.js right-click

我想在右键单击svg圈时出现自定义上下文菜单。 现在我找到this回答,帮助我使用以下代码处理右键单击:

.on("contextmenu", function(data, index) {
   //handle right click

   //stop showing browser menu
   d3.event.preventDefault()
});

现在我想知道如何显示包含一些HTML的框。

提前致谢。

2 个答案:

答案 0 :(得分:10)

d3.select('#stock_details .sym').on("contextmenu", function(data, index) {
    var position = d3.mouse(this);
    d3.select('#my_custom_menu')
      .style('position', 'absolute')
      .style('left', position[0] + "px")
      .style('top', position[1] + "px")
      .style('display', 'block');

    d3.event.preventDefault();
});

答案 1 :(得分:2)

仅对已接受的答案发表评论(没有足够的要点直接评论)。但似乎最新版本的d3需要d3.event.pageX和d3.event.pageY而不仅仅是x和y。根据文档here

所以我的代码是(来自此site的一些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();
  })