【问题标题】:Handle d3 drag events only after long click仅在长按后处理 d3 拖动事件
【发布时间】:2021-03-02 15:06:34
【问题描述】:

我有处理在 d3 中拖动的代码。

我只想在 1000 毫秒后发出拖动事件。(长按)

这对于移动设备来说是必要的,以获得更好的用户体验。

var mouseover_node = null;
var svg = d3.select('body').append('svg').attr('width', 1000).attr('height', 1000);
var rect = svg.selectAll('rect')
  .data([0, 2, 3])
  .enter().append('rect')
  .attr('x', function(x) { return +x * 0; })
  .attr('y', function(y) {  return +y * 120; })
  .attr('width', function() { return 100; })
  .attr('height', function() { return 100; })
  .attr('fill', function(x) {  if(x == 0){return'red';}else return 'blue'; });


rect.on("mouseover", (d) => {this.mouseover_node = d})
  .on("mouseout", (d) => {this.mouseover_node = null})
  .call(d3.drag()
    .on("start", function () {
        console.log('start');
        return false;
        })
    .on("drag", function () {
        console.log('drag');
        })
    .on("end",  (sourceElement,index,svgItems) => {
        console.log('end drag with mouseover: ' + this.mouseover_node);
        })
);

我们如何在 JavaScript 中做到这一点?

【问题讨论】:

    标签: javascript svg d3.js


    【解决方案1】:

    可能在"start""drag"中使用Date.now()并检查经过的时间是否大于1000ms。

    var click_start, drag_start;
    
    rect.call(
      d3.drag()
        .on("start", function () {
          console.log("start");
          click_start = Date.now();
        })
        .on("drag", function () {
          drag_start = Date.now();
          if (drag_start - click_start >= 1000) {
            console.log("drag");
          }
        })
    );
    

    【讨论】:

    • 感谢您的 Pawel,您的回答会很棒。而且我已经用它来虚拟化长点击事件。但是在移动设备中(正如我提到的,我的目标是让它在移动设备中工作),当我从节点拖动开始时,鼠标拖动事件到屏幕移动不起作用。这里的拖动意味着手指移动。甚至长点击事件在我的 android 中也无法正常工作。并且原始的移动长按发出文本选择而不是虚拟/自定义长按(1000 毫秒)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2014-05-04
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多