【问题标题】:Jquery UI droppable not working with html 5 draggableJquery UI droppable 不适用于可拖动的 html 5
【发布时间】:2017-04-27 11:14:02
【问题描述】:

我有一个应用了 HTML 可拖动的 div,以及一个应用了 jquery UI droppable 的容器。 问题是当我拖动我的 HTML div 并经过可放置容器时,容器的可放置容器不起作用。 我不能使用 HTML droppable 事件,因为我需要在可拖动事件出现时触发,out,enter 事件,out 和 enter,在 HTML droppable 的情况下,它不起作用。 (它考虑的是鼠标指针,而不是拖动元素)。

HTML


HTML 可拖动:

<div draggable="true" (dragstart)="handleDragStart($event)" (dragend)="handleDragEnd($event)"></div>

Jquery droppable 的 HTML :

<div class="large-container">
<div class="column-cell dynamically-created-div"></div>
<div class="column-cell dynamically-created-div"></div>
<div class="column-cell dynamically-created-div"></div>
...n number of droppable cells

</div>

JS

$('.column-cell').droppable(
  {
    tolerance: 'touch',
    out: function (event: any, ui: any) {
      let columnId = $(event.target).data('columnid');
      console.log('out from ', columnId);
    },
    over: function (event: any, ui: any) {
      let columnId = $(event.target).data('columnid');
      console.log('Over on ', columnId);
    },
    drop: (event: any, ui: any) => {
      let columnId = $(event.target).data('columnid');
      console.log('dropped to  ', columnId);
    }
  }
);

【问题讨论】:

  • 建议添加accept 选项。
  • 还有很多这似乎不是 JavaScript。参数语法看起来不正确,=&gt; 不是语法的一部分。 let 也较旧。
  • 你读过这个吗:forum.jquery.com/topic/…
  • 到目前为止,我可以看到可拖动元素不是jQuery对象,我认为droppable因此不愿意接受它。想看看两者能不能混在一起。您不使用可拖动和可放置是有原因的吗?

标签: css html jquery-ui


【解决方案1】:

这需要一些研究。这应该将 Native HTML5 传递给每个事件的 jQuery UI Droppable。

测试示例:https://jsfiddle.net/ujqmxqjv/17/

HTML

<div draggable="true"></div>

<div class="large-container">
  <div class="column-cell dynamically-created-div"></div>
  <div class="column-cell dynamically-created-div"></div>
  <div class="column-cell dynamically-created-div"></div>
  ...n number of droppable cells
</div>

JavaScript

// Tell jQuery to include this property
$.event.addProp("dataTransfer");

$(function() {
  function pass2Drop(event, eventType) {
    var f = $(event.target).droppable("option", eventType);
    var el = event.dataTransfer.getData("text/html");
    var ui = {
      draggable: $(el),
      helper: $(el),
      position: {
        top: event.pageY,
        left: event.pageX
      },
      offset: {
        top: event.offsetY,
        left: event.offsetX
      }
    }
    f.call(event.target, event, ui);
  }

  $("div[draggable='true']").on("dragstart", function(ev) {
    var dt = ev.dataTransfer;
    dt.setData("text/html", ev.target.outerHTML);
  });

  $('.column-cell').droppable({
    tolerance: 'touch',
    activeClass: "ui-state-highlight",
    out: function(e, ui) {
      console.log("jQuery UI Out on " + $(e.target).index(), ui);
    },
    over: function(e, ui) {
      console.log("jQuery UI Over on " + $(e.target).index(), ui);
    },
    drop: function(e, ui) {
      console.log("jQuery UI Drop on " + $(e.target).index(), ui);
      console.log("Dropped: ", ui.draggable);
    }
  });

  $(".column-cell").on("dragover", function(ev) {
    ev.preventDefault();
    console.log("Native Drag Over on " + $(ev.target).index());
    pass2Drop(ev, "over");
  }).on("dragleave", function(ev) {
    console.log("Native Drag Leave on " + $(ev.target).index());
    pass2Drop(ev, "out");
  }).on("drop", function(ev) {
    if (ev.stopPropagation) {
      ev.stopPropagation(); // Stops some browsers from redirecting.
    }
    console.log("Native Drop on " + $(ev.target).index());
    pass2Drop(ev, "drop");
  });
});

我尝试.trigger() 事件,但效果更好。我们从 Droppable 中获取事件回调,创建 ui 并将 eventui 传递给函数。这具有从原生事件触发它并传入预期元素的效果,以便我们的 jQuery UI 回调正常运行。

【讨论】:

  • 您好,谢谢您的回复,但是您分享的小提琴好像已经不存在了(404),您能再分享一下吗,或者链接到JSBIN?
  • 好的,pass2Drop 有效!感谢您的解决方案,但有 1 个主要问题,仅当鼠标指针触摸目标 droppable 时才会触发事件“dragover”,这与 jquery droppable 不同(由于容差 = 'touch' 属性而快速调用)
  • @Awadhoot 这是因为拖动的项目不是 jQuery 对象。如果您想使用该功能,请使用 .draggable() 并且不要使用 Native HTML5 DnD。否则,这适用于鼠标。您可以根据需要为拖动的项目添加间距。
猜你喜欢
  • 2013-02-28
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 2011-04-26
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
相关资源
最近更新 更多