【问题标题】:Joint.js Drag and Drop Element between two papersJoint.js 在两篇论文之间拖放元素
【发布时间】:2023-03-28 16:35:01
【问题描述】:

我正在两篇论文之间实现拖放。但是由于我的 html 正文中有两篇论文,所以我被拖动元素的偏移量与光标位置的同步卡住了。我对 css 的经验非常少,这可能会导致问题元素的定位。

用例:-

用户单击纸张 2 中的元素并开始拖动并转到纸张 1。 在 Pointer up 上,该元素的克隆被添加到论文 1 中光标所在位置的论文 1。

我的处理策略是:-

当用户点击鼠标时

1.动态创建一个div

2.创建第三篇论文,在新的 div 中命名为“flypaper” 复制您要克隆的元素,并将其添加到“flypaper”

3.创建一个mousemove监听器,用鼠标移动包含“flypaper”的div

4.添加一个 mouseup 事件,当用户释放按钮时,该事件会将元素的克隆添加到“paper2”。

5.清理“flypaper”的 div 和事件。

<body>
<div id="paper" class="paper" style="border-style: solid;border-width: 5px;width:600px"></div>
<div id="paper2" class="paper" style="border-style: solid;border-width: 5px;width:600px;display:inline-block" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<script>
    var graph = new joint.dia.Graph;
    var paper = new joint.dia.Paper({
        el: $('#paper'),
        width: 600,
        height: 200,
        model: graph,
        gridSize: 1

    });
    var rect = new joint.shapes.basic.Rect({
        position: { x: 100, y: 30 },
        size: { width: 100, height: 30 },
        attrs: { rect: { fill: 'blue' }, text: { text: 'my box', fill: 'white' } }
    });
    graph.addCells([rect]);
    ////////////////////////////////////////////////////////
    var graph2 = new joint.dia.Graph;
    var paper2 = new joint.dia.Paper({
        el: $('#paper2'),
        width: 600,
        height: 200,
        model: graph2,
        gridSize: 1
    });
    paper2.on('cell:pointerup',function (cellView, evt, x, y) {
        var rect4 = new joint.shapes.basic.Rect({
            position: { x: 10, y: 50 },
            size: { width: 100, height: 30 },
            attrs: { rect: { fill: 'blue' }, text: { text: 'my box', fill: 'white' } }
        });

        graph.addCells([rect4]);
    });
    paper2.on('cell:pointerdown',function (cellView, evt, x, y) {
        $('body').append('<div id="flyPaper" class="box" style="position: fixed;z-index: 100;display:block;opacity:.7;"></div>');
        var graph3 = new joint.dia.Graph;
        var paper3 = new joint.dia.Paper({
            el: $('#flyPaper'),
            width: 600,
            height: 200,
            model: graph3,
            gridSize: 1
        });
        var rect3 = new joint.shapes.basic.Rect({
            position: { x: 10, y: 50 },
            size: { width: 100, height: 30 },
            attrs: { rect: { fill: 'blue' }, text: { text: 'my box', fill: 'white' } }
        });

        graph3.addCells([rect3]);
        $('body').mousemove(function(e){
            var mouseX   =  e.pageX; //get mouse move position
            var mouseY   =  e.pageY;
            $( "div.box" ).offset({ top: mouseY, left: mouseX });
            // $('div.box',this).css({'top': boxPositionY,'left': boxPositionX})
        });

    });

    var rect2 = new joint.shapes.basic.Rect({
        position: { x: 10, y: 50 },
        size: { width: 100, height: 30 },
        attrs: { rect: { fill: 'blue' }, text: { text: 'my box', fill: 'white' } }
    });
    graph2.addCells([rect2]);
</script>
</body>

【问题讨论】:

    标签: javascript svg drag-and-drop jointjs


    【解决方案1】:

    我遇到了同样的问题(并且有客户不会为rappid 付费,这会将这个功能添加到jointjs)。所以这里有一个可以帮助其他人的 sn-p(见下文)。

    步骤与您指出的相同:
    1.动态创建一个div
    2.创建第三张纸,在新的 div 中将其命名为“flypaper” 复制您要克隆的元素,并将其添加到“flypaper”
    3.创建一个mousemove监听器,用鼠标移动包含“flypaper”的div
    4.添加一个 mouseup 事件,当用户释放按钮时,该事件会将元素的克隆添加到“paper2”。
    5.清理“flypaper”的div和事件。

    解决您的问题的方法是使用cellView.model.clone() 添加正确的元素,然后使用$.offset$.width()$.height() 进行一些计算以获取正确的飞行纸位置并检查是否发生掉落事件目标论文。

    View on codepen

    <body>
    <div id="paper" class="paper" style="border-style: solid;border-width: 5px;width:600px"></div>
    <div id="paper2" class="paper" style="border-style: solid;border-width: 5px;width:600px;display:inline-block"></div>
    <script>
        // Canvas where sape are dropped
        var graph = new joint.dia.Graph,
          paper = new joint.dia.Paper({
            el: $('#paper'),
            model: graph
          });
    
        // Canvas from which you take shapes
        var stencilGraph = new joint.dia.Graph,
          stencilPaper = new joint.dia.Paper({
            el: $('#stencil'),
            height: 60,
            model: stencilGraph,
            interactive: false
          });
    
        var r1 = new joint.shapes.basic.Rect({
          position: {
            x: 10,
            y: 10
          },
          size: {
            width: 100,
            height: 40
          },
          attrs: {
            text: {
              text: 'Rect1'
            }
          }
        });
        var r2 = new joint.shapes.basic.Rect({
          position: {
            x: 120,
            y: 10
          },
          size: {
            width: 100,
            height: 40
          },
          attrs: {
            text: {
              text: 'Rect2'
            }
          }
        });
        stencilGraph.addCells([r1, r2]);
    
        stencilPaper.on('cell:pointerdown', function(cellView, e, x, y) {
          $('body').append('<div id="flyPaper" style="position:fixed;z-index:100;opacity:.7;pointer-event:none;"></div>');
          var flyGraph = new joint.dia.Graph,
            flyPaper = new joint.dia.Paper({
              el: $('#flyPaper'),
              model: flyGraph,
              interactive: false
            }),
            flyShape = cellView.model.clone(),
            pos = cellView.model.position(),
            offset = {
              x: x - pos.x,
              y: y - pos.y
            };
    
          flyShape.position(0, 0);
          flyGraph.addCell(flyShape);
          $("#flyPaper").offset({
            left: e.pageX - offset.x,
            top: e.pageY - offset.y
          });
          $('body').on('mousemove.fly', function(e) {
            $("#flyPaper").offset({
              left: e.pageX - offset.x,
              top: e.pageY - offset.y
            });
          });
          $('body').on('mouseup.fly', function(e) {
            var x = e.pageX,
              y = e.pageY,
              target = paper.$el.offset();
    
            // Dropped over paper ?
            if (x > target.left && x < target.left + paper.$el.width() && y > target.top && y < target.top + paper.$el.height()) {
              var s = flyShape.clone();
              s.position(x - target.left - offset.x, y - target.top - offset.y);
              graph.addCell(s);
            }
            $('body').off('mousemove.fly').off('mouseup.fly');
            flyShape.remove();
            $('#flyPaper').remove();
          });
        });
    </script>
    </body>
    

    【讨论】:

    • 如果拖放必须对链接起作用,需要进行哪些更改?
    • 嗨@François-XavierAeberhard。我正在尝试您的代码,但是如果我需要在拖动后更改进程的名称,如果我拖动到矩形,我想为两个矩形提供两个不同的名称
    • @Keerthi Reddy Yeruva,我也有同样的要求。你找到解决方案了吗?谢谢!
    • @konekoya 你能详细说明一下,我不确定我是否理解这个问题
    • 感谢您回复@François-XavierAeberhard!你的 sn-p 对我来说效果很好。但是我有一个 Keerthi 在上述 cmets 中提到的要求:如果我需要在拖动后更改进程名称怎么办?可能是提示符或文本编辑器之类的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多