Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript d3拖动行为:在拖动名称空间中注册、侦听和触发不同的类型?_Javascript_D3.js - Fatal编程技术网

Javascript d3拖动行为:在拖动名称空间中注册、侦听和触发不同的类型?

Javascript d3拖动行为:在拖动名称空间中注册、侦听和触发不同的类型?,javascript,d3.js,Javascript,D3.js,键入d3.behavior.drag()让我感到困惑。我想指定拖动类型,以便不同的对象触发不同的拖动事件。我习惯于使用D3 dispatches/namespaces编程,执行以下操作: 向D3分派对象注册它们 然后使用类似于.on('click.typeHere')的方法侦听分派事件 并使用dispatch.typeHere()触发事件 我搞不清楚正常的调度过程是如何应用于拖动行为的。例如: var svg=d3.select('svg').append('g')) .attr('trans

键入
d3.behavior.drag()
让我感到困惑。我想指定拖动类型,以便不同的对象触发不同的拖动事件。我习惯于使用D3 dispatches/namespaces编程,执行以下操作:

  • 向D3分派对象注册它们
  • 然后使用类似于
    .on('click.typeHere')
    的方法侦听分派事件
  • 并使用
    dispatch.typeHere()
    触发事件 我搞不清楚正常的调度过程是如何应用于拖动行为的。例如:

    var svg=d3.select('svg').append('g'))
    .attr('transform','translate(0,20)');
    append('rect')
    .attr('height',50)
    .attr('width',20)
    .样式(“填充”、“钢蓝”);
    var drag=d3.behavior.drag();
    drag.on('drag',function(){
    log('drag');
    }).on('drag.type',function(){
    log('namespace active');
    }).on('drag.type2',function(){
    log('namespace2active');
    });
    append('circle')
    .attr('cx',20)
    .attr('cy',0)
    .attr('r',10)
    .style('填充','橙色')
    .呼叫(拖动)
    
    我会对不同类型的对象使用不同的拖动行为,相应的拖动处理程序会执行相应的操作。这将使您无需再处理事件名称空间:

    var drag1 = d3.behavior.drag()
    .on('drag', function() {
      console.log('drag rect');
    });
    
    svg.append('rect').call(drag1);
    
    var drag = d3.behavior.drag()
    .on('drag', function() {
      console.log('drag circle');
    });
    
    svg.append('circle').call(drag);
    

    完成演示。

    我会将不同的拖动行为附加到不同类型的对象上。对于每一个对象,您都可以有一个单独的
    drag
    处理程序来执行相应的操作。我之前尝试声明了多个
    d3.behavior.drag
    对象,但我自动定义的所有类型都被提升到全局d3命名空间。例如,在上面的示例中,
    type
    type2
    将在单独的拖动实例中,但这两个实例仍将在所有拖动中触发,而不管对象的所谓拖动实例是什么。如果有帮助的话,我可以把它添加到示例代码中。我的意思是,奇怪,我可以发誓我以前也做过同样的事情。如果您想粘贴JSFIDLE作为答案,我将接受它。谢谢