D3.js 在D3JS中如何区分鼠标单击和双击同一节点元素

D3.js 在D3JS中如何区分鼠标单击和双击同一节点元素,d3.js,D3.js,需要进行两种不同的操作,一种用于单击,另一种用于双击。单击可以工作,但对于双击,它将转到单击功能,然后转到双击功能。如何在双击发生时停止单击功能触发,或者如何捕获事件类型single或double。请提供帮助 根据这个例子,我正在使用如下所示..这是正确的方法吗 var nodeEnter = node.enter() .append("g") .attr("class","

需要进行两种不同的操作,一种用于单击,另一种用于双击。单击可以工作,但对于双击,它将转到单击功能,然后转到双击功能。如何在双击发生时停止单击功能触发,或者如何捕获事件类型single或double。请提供帮助

根据这个例子,我正在使用如下所示..这是正确的方法吗

                     var nodeEnter = node.enter()
                    .append("g")
                    .attr("class","node")
                    .attr("transform", function(d) {
                        return "translate(" + source.x0 + "," + (-(source.y0)) + ")";
                    }).on('click', click);






                                 function click{
                                  var cc = clickcancel();
                                cc.on('click', function() {

                           addDetailsDiv(d.id, d.name, d.type);
                }); 

                      cc.on('dblclick', function() {
                    dblclick();
                });

我也遇到了同样的问题,我找到了一个解决方案,该解决方案至少适用于API的v3。解决方案的要点是,如果第二次鼠标单击在某个时间(本例中为300毫秒)之前到达,则向上/向下捕捉鼠标,并发出
dblclick
事件,否则将发出
click
事件:

d3Utils.js }

index.js
上面的事情已经完成了。问题是当你双击的时候。首先它会转到foo,然后是bar,但我需要我应该直接转到bara,在我完成了一点研究之后。我把这个函数应用到一个快速的例子中,它是有效的…但必须有一个更简单的方法。我也无法打开Lars提供的示例…我认为Github遇到了问题。在这里,具有正确数据绑定的修改版本
d3。在v4中已删除重新绑定
,因此上面的示例不起作用。有人有v4的工作示例吗?你们看到了吗?嗨,拉尔斯。你们提到的页面没有打开!!!!嗯,现在好像坏了。给它几分钟:)现在它打开了,检查一下它可能的副本
someSelection
    ...
    .on("click", foo)
    .on("dblclick", bar)
const d3 = require('d3')

module.exports = {
  // Get a function that dispatches 'click' and 'dblclick' events for a D3 selection
  getClickDispatcher: () => {
    const clickEvent = d3.dispatch('click', 'dblclick')

    return d3.rebind((selection) => {
      let waitForDouble = null

      // Register click handler on selection, that issues click and dblclick as appropriate
      selection.on('click', (projectProxy) => {
        d3.event.preventDefault()
        if (waitForDouble != null) {
          clearTimeout(waitForDouble)
          waitForDouble = null
          clickEvent.dblclick(d3.event, projectProxy)
        } else {
          const currentEvent = d3.event
          waitForDouble = setTimeout(() => {
            clickEvent.click(currentEvent, projectProxy)
            waitForDouble = null
          }, 300)
        }
      }
    })
  }, clickEvent, 'on')
},
const {getClickDispatcher,} = require('./d3Utils')

const clickDispatcher = getClickDispatcher()
  .on('click', () => {
    console.log('A single click was detected')
  })
  .on('dblclick', () => {
    console.log('A double click was detected')
  })

// Hook up clickDispatcher
d3.select('.node')
  .call(clickDispatcher)