简体   繁体   English

d3 click 事件在克隆元素 append 用于拖动事件后不起作用

[英]d3 click event do not working after clone element append for drag event

use "d3": "^3.5.17" in angular在 angular 中使用 "d3": "^3.5.17"

    const dragEvent = {
      dragstarted: function(d) {
        console.log(`drag start`);
        d3.event.sourceEvent.stopPropagation();
        const node = d3.select(this.parentNode).node();
        const clonedG = node.cloneNode(true);
        d3.select(clonedG).attr('id', 'dragging').classed('dragging', true).attr('opacity', 0.7);

        // problem
        node.parentNode.append(clonedG);
      },
      dragged: function(d) {
        console.log(`drag`);
        d3.select('#dragging').attr('transform', `translate(${(d.x = d3.event.x)},${(d.y = d3.event.y)})`);
      },
      dragended: (d) => {
        // todo: drop call
        console.log(`dragended`);
        const dragging = document.getElementById('dragging');
        dragging.parentNode.removeChild(dragging);
      }
    };

    const drag = d3.behavior.drag()
      .origin(function(d) {
        d = {x: 0, y: 0};
        return d;
      })
      .on('dragstart', dragEvent.dragstarted)
      .on('drag', dragEvent.dragged)
      .on('dragend', dragEvent.dragended);

    d3.selectAll('.select-rect')
      .datum({x: 0, y: 0})
      .call(drag)
      .on('click', function () {
        console.log(`click`);
        if (d3.event.defaultPrevented) { return; }
        console.log(`clicked`);
      });

I am sorry first.首先我很抱歉。
my English is bad.我的英语不好。

I want to drag a new element and delete it when the drag ends.我想拖动一个新元素并在拖动结束时将其删除。
But I have some problem with this line: node.parentNode.append(clonedG);但我对这一行有一些问题: node.parentNode.append(clonedG);
The click event is not working after appending the cloned element.附加克隆元素后,单击事件不起作用。

Am I wrong?我错了吗?
Or the click event handle again after drag end event?还是拖动结束事件后再次单击事件句柄?
Can anyone help me?谁能帮我?

I solved this issue.我解决了这个问题。

 let isClick = false;
    const dragEvent = {
      dragstarted: function(d) {
        console.log(`drag start`);
        d3.event.sourceEvent.stopPropagation();
      },
      dragged: function(d) {
        if (!isClick) {
          isClick = true;
          const node = d3.select(this.parentNode).node();
          const clonedG = node.cloneNode(true);
          d3.select(clonedG).attr('id', 'dragging').classed('dragging', true).attr('opacity', 0.7);

          // problem
          node.parentNode.append(clonedG);
        }
        console.log(`drag`);
        // tslint:disable-next-line:no-shadowed-variable
        const dragging = d3.select('#dragging');
        console.log(`dragging`, dragging);
        if (dragging) {
          dragging.attr('transform', `translate(${(d.x = d3.event.x)},${(d.y = d3.event.y)})`);
        }
      },
      dragended: (d) => {
        // todo: drop call
        console.log(`dragended`);
        isClick = false;
        const dragging = document.getElementById('dragging');
        if (dragging) {
          dragging.parentNode.removeChild(dragging);
        }
      }
    };

changed dragstarted part更改了拖动开始部分
clone element code move to dragged part克隆元素代码移动到被拖动的部分
but I don't know different.但我不知道不同。
bless you dev people!祝福你们开发人员!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM