而合并与旧D3“重新绑定”“双击”代码错误替补

问题描述 投票:0回答:1

我试图恢复其在“node.on”方法D3的早期版本中呈现双击事件。我需要与d3.forceSimulation使用它。

替代snippet为双击事件,我发现工作在旧版本d3的罚款。它还使用其从当前d3和其也具有substitute除去旧d3.rebind方法。我想这两个片段合并但失败,错误“不能读取属性‘应用’未定义”。

以下是合并后的代码:

<div id='map'></div>
<script>

function clickcancel() {

// Copies a variable number of methods from source to target.
d3.rebind = function(target, source) {
  var i = 1, n = arguments.length, method;
  while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);
  return target;
};

// Method is assumed to be a standard D3 getter-setter:
// If passed with no arguments, gets the value.
// If passed with arguments, sets the value and returns the target.
function d3_rebind(target, source, method) {
  return function() {
    var value = method.apply(source, arguments);
    return value === source ? target : value;
  };
}

  // we want to a distinguish single/double click
  // details http://bl.ocks.org/couchand/6394506
  var event = d3.dispatch('click', 'dblclick');
  function cc(selection) {
      var down, tolerance = 5, last, wait = null, args;
      // euclidean distance
      function dist(a, b) {
          return Math.sqrt(Math.pow(a[0] - b[0], 2), Math.pow(a[1] - b[1], 2));
      }
      selection.on('mousedown', function() {
          down = d3.mouse(document.body);
          last = +new Date();
          args = arguments;
      });
      selection.on('mouseup', function() {
          if (dist(down, d3.mouse(document.body)) > tolerance) {
              return;
          } else {
          if (wait) {
              window.clearTimeout(wait);
              wait = null;
              event.dblclick.apply(this, args);
          } else {
              wait = window.setTimeout((function() {
                  return function() {
                      event.click.apply(this, args);
                      wait = null;
                  };
              })(), 300);
          }
      }
  });
};
  return d3.rebind(cc, event, 'on');
}

var cc = clickcancel();
d3.select('#map').call(cc);
cc.on('click', function(d, index) {
d3.select('#map').text(d3.select('#map').text() + 'click, ');
});
cc.on('dblclick', function(d, index) {
d3.select('#map').text(d3.select('#map').text() + 'dblclick, ');
});
d3.js double-click dynamic-rebinding
1个回答
0
投票

更简单的方式来获得双击的功能:

//Set variables
<script type="text/javascript">
var clickDate = new Date();
var difference_ms;

//Set dragstarted functionality fired on '.call(d3.drag().on("start", dragstarted)'
function dragstarted(d) {
    difference_ms = (new Date()).getTime() - clickDate.getTime();
    clickDate = new Date();
    if(difference_ms > 200) {
        d3.select(this).classed("fixed", d.fixed = true);
        if (!d3.event.active) simulation.alphaTarget(0.3).restart();
        d.fx = d.x;
        d.fy = d.y;
    } else {
        d3.select(this).classed("fixed", d.fixed = false);
        if (!d3.event.active) simulation.alphaTarget(0.3).restart();
        d.fx = d.x;
        d.fy = d.y;
        };
    }

//Set dragended functionality fired on '.call(d3.drag().on("end", dragended)'
function dragended(d) {
    if (!d3.event.active) simulation.alphaTarget(0);
    if(difference_ms < 200) {
        d.fx = null;
        d.fy = null;
    };
}

的方式,我偶然发现了可以复活了棘手的代码是光荣here的注释中描述nharrisanalyst。虽然我还是不明白为什么要遵循这样一个复杂的路径:

var cc = clickcancel();
d3.select('#map').call(cc); //#map is the element just for example

cc.on('click', function(d, index) {
    d3.select('#map').text(d3.select('#map').text() + 'click, ');
});

cc.on('dblclick', function(d, index) {
    d3.select('#map').text(d3.select('#map').text() + 'dblclick, ');
});

function clickcancel() {}
© www.soinside.com 2019 - 2024. All rights reserved.