克隆后如何拖动元素 [英] How to drag element after cloning

查看:99
本文介绍了克隆后如何拖动元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在追加到父节点后拖动克隆元素。我试过拖动方法,但它不工作。

How to drag a cloned element after appending to parent node. I have tried with the drag method but it isn't working. I am new to d3 js and trying to go basics and examples on fiddle.

演示: https://jsfiddle.net/pmczny6k/

代码:

<html>
    <head>
        <title>Editor</title>
        <meta http-equiv="x-ua-compatible" content="ie=9"/>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
        <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
        <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
        <script type="text/javascript">
            window.onload = function ()
            {
                var svgContainer = d3.select("body").append("svg")
                        .attr("width", 200)
                        .attr("height", 200);
                var circle = svgContainer.append("circle")
                        .attr("cx", 30)
                        .attr("cy", 30)
                        .attr("r", 20);

                var rectangle = svgContainer.append("rect")
                        .attr("x", 100)
                        .attr("y", 100)
                        .attr("width", 50)
                        .attr("height", 50);

                //clonning

                function move() {
                    d3.select(rectangle)
                            .attr('x', d3.event.x - parseInt(d3.select(this).attr("width")) / 2)
                            .attr('y', d3.event.y - parseInt(d3.select(this).attr("height")) / 2);
                    this.parentNode.appendChild(this);
                }
                ;

                d3.selectAll(".drg").style("fill", "red")
                        .call(
                                d3.behavior.drag()
                                .on('drag', move).origin(function () {
                            var t = d3.select(this);
                            return {x: t.attr("x"), y: t.attr("y")};
                        })
                                .on('dragend', function (d) {
                                    var elem = d3.select(this);
                                    elem.attr("x", elem.attr("initial-x"));
                                    elem.attr("y", elem.attr("initial-y"));
                                    console.log(elem.attr("x"));
                                    var mouseCoordinates = d3.mouse(this);
                                    if (mouseCoordinates[0] > 70) {
                                        //Append new element
                                        d3.select("svg").append("rect")
                                                .classed("drg", true)
                                                .attr("width", 50)
                                                .attr("height", 50)
                                                .attr("x", mouseCoordinates[0])
                                                .attr("y", mouseCoordinates[1])
                                                .style("fill", "green");
                                    }
                                })
                                )
            };
        </script>
    </head>
    <body>
            <svg width="1024" height="768" style="background-color: #204d74">
            <!--<g>-->
            <rect x="10" y="20" height="250" width="300" style="fill: #080808"></rect>
            <rect class="drg" x="12" y="22" initial-x="12" initial-y="22" height="50" width="50" style="fill: #f0ad4e"></rect>
            <!--</g>-->
            <rect x="10" y="280" height="250" width="300" style="fill: #080808"></rect>
            <rect class="drg" x="12" y="282" initial-x="12" initial-y="282" height="50" width="50" style="fill: #f0ad4e"></rect>
            <rect x="320" y="20" height="510" width="690" style="fill: #080808"></rect>
            </svg>
    </body>
</html>


推荐答案

只需添加 strong>调用到新创建的 rect 对象:

Just added another call to the new created rect object:

.call(
    d3.behavior.drag()
    .on('drag', move).origin(function() {
        var t = d3.select(this);
        return {x: t.attr("x"), y: t.attr("y")};
    }));

已更新 fiddle

您也有一些语法错误。请检查他们在一个更好的语法高亮工具,因为小提琴不是一个好的方法来做到这一点。希望它现在按预期工作。

You also have some syntax errors. Please check them on a better syntax highlighting tool as fiddle isn't a good way to do this. Hope it works now as expected.

这篇关于克隆后如何拖动元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆