可以拖动 HTML dom 元素和放到 SVG dom 元素上?

发布于 2024-12-10 02:45:41 字数 836 浏览 0 评论 0原文

我目前正在使用 Raphaël JS(可以切换到 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。他们似乎都没有触发 drop 事件。据我所知,Raphaël 版本不起作用,因为 jQuery 的 dom 操作无法与 SVG dom 交互。

JS Fiddle jQuery SVG: http://jsfiddle.net/cqMUL/5/ (您将拥有向下滚动以查看 SVG 元素,抱歉)。

其他可能的解决方案似乎是:
a) 使用 Raphaël 及其内置的 dragonDragOver 函数,尽管我正在使用所有 SVG 并且尝试使用 HTML dom 代表移动的部分,因为它们将是图像(带背景图像的 div)。此外,我可能必须自己实现 drop。
b) 尝试使用 HTML5 拖动&下降,尽管我不确定这是否有效。

I'm currently using Raphaël JS (open to switching to jQuery SVG) and jQuery UI to try and make a prototype of a board game. It's somewhat similar to Risk in that the board is a map and you can (hopefully soon) drag pieces from one zone on the map to another (say from A to B) and drop them there. Once dropped, it would trigger a callback to do some work.

Right now I'm stuck trying to get the drag/drop functionality. I want to drag an html element (div) and drop it onto an SVG element. I'm not very familiar with SVG, but from what I understand there's issues to overcome in getting the HTML and SVG DOMs to work together.

I've got two versions and I'm trying to get jQuery UI to drag/drop to with either of them. One is using jQuery SVG with the svgdom plugin + jQuery UI and the other is just Raphaël + jQuery UI. Neither of them seems to be firing the drop event. As far as I know, the Raphaël version doesn't work because jQuery's dom manipulation can't interact with the SVG dom.

JS Fiddle jQuery SVG: http://jsfiddle.net/cqMUL/5/ (you'll have to scroll far down to see the SVG elements, my apologies).

The other possible solutions seem to be:
a) Using Raphaël with it's builtin drag and onDragOver functions, although then I'm using all SVG and I'm trying to use the HTML dom for the moving pieces because they will be images (div with background image). In addition, I'd probably have to implement drop myself.
b) Trying to use HTML5 drag & drop, although I'm not sure this would work either.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

漫雪独思 2024-12-17 02:45:41

这是一个老问题,但无论如何我都会尝试回答它。我想出的解决方案是这样工作的:

  1. 使用 JQueryUI 创建“可拖动”功能。它有很多
    方便的挂钩。
  2. 将 mouseover 和 mouseout 事件附加到 SVG 元素。
  3. 创建自定义拖放管理器。
  4. 当您开始拖动时,注册元素(或关联数据)
    与拖放管理器。
  5. 当您将鼠标悬停在放置目标上时,将该目标注册到
    拖放管理器。
  6. 检查 JQueryUI.draggable 的“停止”事件上的“删除”条件,以及
    在那里进行所需的处理。

您可以在此处查看实际操作的示例(使用 D3 生成 SVG):http://bl。 ocks.org/thudfactor/6611441

This is an old question, but I'll give a shot at answering it anyway. The solution I came up with worked like this:

  1. Use JQueryUI to create the "draggable" functionality. It has a lot
    of convenient hooks.
  2. Attach mouseover and mouseout events to the SVG elements.
  3. Create a custom drag/drop manager.
  4. When you start a drag, register the element (or associated data)
    with the dragdrop manager.
  5. When you hover over a drop target, register that target with the
    dragdrop manager.
  6. Check your "drop" criteria on JQueryUI.draggable's "stop" event, and
    do the processing required there.

You can see an example of this in action (using D3 to generate the SVG) here: http://bl.ocks.org/thudfactor/6611441

前事休说 2024-12-17 02:45:41

事实上,SVG 很难操作。 这是一个您可以根据其进行编程的示例;只要看看源码就可以了。

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

  1. 您可以使用不同的 z 索引使这些片段绝对定位
    ,然后使用 jquery ui 来移动它们。
  2. 您可以使用 Canvas 和 HTML5。使用它,您也不需要 JQuery UI。

Indeed, SVG is difficult to manipulate. Here is an example you could base your programming on; just look at the source.

Alternatively, if ever you decide to abandon SVG, here are a couple of other ideas.

  1. You could make the pieces absolutely positioned <div>s with different z-indexes, then use jquery ui to move them.
  2. You could use Canvas and HTML5. Using this, you wouldn't need JQuery UI either.
静待花开 2024-12-17 02:45:41

你可以使用 Rapheal.js
这可以通过应用简单的 jquery 拖放来完成,使我们的 html 元素可拖动,并且您的 rapheal paper 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");

});

you can use Rapheal.js
It could be done by applying simple jquery drag and drop, Make our html element draggable and your rapheal paper div droppable. Here is code

HTML Code:

<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 Code:

$(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");

});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文