JQuery & SVG 拖放



几天来,我的头一直撞在墙上,但一无所获,所以我只想找到某种确认,我想做的事情实际上是可行的。。。。

我有一个DIV中有SVG的页面。我希望能够点击SVG的一个组件并拖动它。理论上很简单。我在一个混乱的原始javascript版本中有过这种情况,但为了保持一致性,我尝试在JQuery中这样做。

我有以下内容,它拖动了整个容器DIV:

*var svgName="/mySvg.svg";

$(document).ready(function($) {
    $('#svgDiv').svg();
    var svg = $('#svgDiv').svg('get');
    svg.load(svgName,
    function () {
        $('#svgDiv').draggable().bind('mousedown', function(event, ui) {
            $(event.target.parentElement).append( event.target );
        }).bind('drag', function(event, ui) {
            event.target.setAttribute("transform", "translate("+event.clientX+","+event.clientY+")");
        });
    });
});

*

我把它改成了这个,我想这会通过它的ID获得SVG的一个元素,但这并没有起到任何作用。就好像JQuery看不到DIV的"内部"(没有更好的词)。*

var svgSource = "/mySvg.svg";
$(document).ready(function($) {
    $('#svgDiv').svg();
    var svgObj = $('#svgDiv').svg('get');
    svgObj.load(svgSource,
        function () {
            var svgObj2 = $('#svgDiv').svg('get');
            var svgElem = svgObj2.getElementById('pathIdOne');
            $(svgElem).draggable().bind('mousedown', function(event, ui) {
                $(event.target.parentElement).append( event.target );
            }).bind('drag', function(event, ui) {
                //event.target.setAttribute("transform", "translate("+event.clientX+","+event.clientY+")");
                event.target.setAttribute('x', ui.position.left);
                event.target.setAttribute('y', ui.position.top);                    
            });
        });
});

*

有人能看到任何明显需要改变的地方吗?这能做到吗?还是完全错了?

我最近花了几天时间研究这个问题,我想出了一个对我来说效果很好的解决方案。这绝对是一个破解,不会在所有情况下都有效。

这个链接很好地描述了如何解决问题,这绝对是"更好"的解决方案。然而,我想继续使用JQuery优秀的Dragable API。

你可以在这里看到我小提琴演奏的快速模型。关键的想法是使用一个代理div,它一直精确地悬停在要拖动的svg元素上。然后在拖动代理div时更改svg元素的x和y坐标

$('#proxy').on('drag', function(e)
    {
        t = $('#background');
        prox = $('#proxy');
        t.attr('x', t.attr('x')*1
                   + prox.css('left').slice(0,-2)*1
                   - prox.data('position').left)
            .attr('y', t.attr('y')*1
                      + prox.css('top').slice(0,-2)*1
                      - prox.data('position').top);
        prox.data('position',{top : prox.css('top').slice(0,-2)*1,
                              left: prox.css('left').slice(0,-2)*1}
                  );
    });

在我的例子中,我想要拖动的SVG元素总是填充屏幕上的某个正方形,所以很容易将代理div定位在目标上。在其他情况下,这可能要困难得多。使用"包含"选项也不难确保不会将背景拖到帧外。。。这只需要一些仔细的计算,并且您必须在每次拖动之间重置包含。

为了使其适用于更多的SVG元素,可以使用变换而不是x和y坐标。

最新更新