可以将HTML DOM元素拖放到SVG DOM元素上?

我目前正在使用RaphaëlJS(可以切换到jQuery SVG)和jQuery UI来尝试制作棋盘游戏的原型。 它与Risk有些类似,因为该板是一张地图,您可以(希望很快)将地图上的一个区域中的棋子拖放到另一个区域(比如从A到B),然后将它们放在那里。 一旦下降,它会触发回调做一些工作。

现在我被卡住了试图获得拖放功能。 我想拖动一个html元素(div)并将其放到SVG元素上。 我对SVG并不是很熟悉,但是从我的理解来看,要让HTML和SVG DOM一起工作需要克服的问题。

我有两个版本,我试图让jQuery UI拖放到任何一个。 一个是使用jQuery SVG与svgdom插件+ jQuery UI,另一个只是Raphaël+ jQuery UI。 他们两人似乎都没有解雇掉落事件。 据我所知,Raphaël版本不起作用,因为jQuery的dom操作不能与SVG dom交互。

JS Fiddle jQuery SVG:http://jsfiddle.net/cqMUL/5/(你必须向下滚动才能看到SVG元素,我的道歉)。

其他可能的解决方案似乎是:
a)使用Raphaël的内置dragonDragOver功能,虽然然后我使用所有的SVG,并且我试图使用HTML dom作为移动部件,因为它们将是图像(带有背景图像的div)。 另外,我可能不得不放弃自己。
b)试图使用HTML5拖放,但我不确定这也可以。


这是一个古老的问题,但无论如何,我会尽全力回答。 我提出的解决方案是这样工作的:

  • 使用JQueryUI创建“可拖动”功能。 它有很多方便的钩子。
  • 将鼠标悬停和鼠标悬停事件附加到SVG元素。
  • 创建一个自定义拖放管理器。
  • 当您开始拖动时,请使用拖拽管理器注册元素(或关联的数据)。
  • 当您将鼠标悬停在放置目标上时,请使用拖放管理器注册该目标。
  • 在JQueryUI.draggable的“停止”事件中检查你的“drop”标准,并在那里做处理。
  • 你可以在这里看到一个例子(使用D3来生成SVG):http://bl.ocks.org/thudfactor/6611441


    事实上,SVG很难操纵。 这里有一个你可以基于你的编程的例子; 只看源头。

    或者,如果您决定放弃SVG,这里还有其他一些想法。

  • 你可以使用不同的z索引完全定位<div> s,然后使用jquery ui来移动它们。
  • 你可以使用Canvas和HTML5。 使用这个,你也不需要JQuery UI。

  • 你可以使用Rapheal.js它可以通过应用简单的jquery拖放来完成,使我们的html元素可拖动,并且你的rapheal纸div可放下。 这是代码

    HTML代码:

    <table style = "width:600px; border:1 px solid black;">
           <tr>
             <td>
               <div id="divDragable" class="ui-widget-content">
        <p>Drag me around</p>
               </div>
             </td>
    
             <td>
             <div id="divDroppable">
               </div>
             </td>
    
           </tr>
        </table>
    

    Jquery代码:

    $(function () {
    
        //--- Draggable
    
        $("#divDragable").draggable();
    
        //-------------------- Code for Raphael---------------------
        var paper = Raphael("divDroppable", 200, 200);
    
        // Making SVG droppable
        $("#divDroppable").droppable({
            drop: function (event, ui) {
                // get targeted SVG elemnet by
                // event.originalEvent.target
            }
    
        });
    
        var recatngleObj1 = paper.rect(10, 15, 50, 30, 2);
        recatngleObj1.attr("id", "emptyRect");
        recatngleObj1.dropShadow(2, 3, 3, 1);
        recatngleObj1.attr("fill", "#B3E6FF");
    
    });
    
    链接地址: http://www.djcxy.com/p/55613.html

    上一篇: Possible to drag an HTML dom element & drop onto an SVG dom element?

    下一篇: Call Delphi DLL from C++\CLI with many parameters