【问题标题】:Ui draggable overlayui可拖动覆盖
【发布时间】:2016-01-17 17:08:03
【问题描述】:

如果您将可拖动的容器放在顶部的容器上,我需要它不会反应。 http://jsfiddle.net/rA4CB/161/

大家好,我已经在一个项目上工作了一段时间,而我刚刚提出了这个问题,它真的会扼杀整个项目。我无法改变它的结构,所以我想知道你们是否知道任何“魔术”来解决这个问题。

<div id="draggable" class="ui-widget-content">
    <p>Drag me to my target</p>
</div>

<div class="droppable" class="ui-widget-header droppable">
    <p>Drop here</p>
</div>
<div class="droppable2" class="ui-widget-header droppable">
    <p>Drop here</p>
</div>
$(function() {


$("#draggable").draggable();
  $(".droppable,.droppable2").droppable({
    tolerance: 'pointer',
    drop: function(event, ui) {
      $(this)
        .addClass("ui-state-highlight")
        .find("p")
        .html("Dropped!");
    }
  });
});

额外信息: droppable 和 droppable2 必须工作,即使 z-index 将被更改。例如 droppable 位于 droppable2 的顶部或相反。在这里,您可以看到 z-index 问题有 2 个可放置函数而不是 1 个。 Link

任何帮助都会很棒!提前致谢。

【问题讨论】:

  • 您的意思是将draggable 放在.droppable2 上,所以droppable 内部文本不会改变? @Deividas
  • 如果我理解正确,只需删除并更改为$(".droppable2")...
  • 你能详细说明你的答案吗?

标签: jquery jquery-ui draggable droppable


【解决方案1】:

您可以使用顶部的 overout 事件来禁用背面的事件。像这样的:

$(function() {
  $("#draggable").draggable();
  $(".droppable").droppable({
    tolerance: 'pointer',
    drop: function(event, ui) {
      $(this)
        .addClass("ui-state-highlight")
        .find("p")
        .html("Dropped!");
    }
  });
  $(".droppable2").droppable({
    tolerance: 'pointer',
    drop: function(event, ui) {
      $(this)
        .addClass("ui-state-highlight")
        .find("p")
        .html("Dropped!");
    },
    over: function(event, ui) {
      $(".droppable").droppable("disable")
    },
    out: function(event, ui) {
      $(".droppable").droppable("enable")
    }
  });
});

请注意,如果您不想在禁用时获得视觉反馈,则需要更改禁用状态的 CSS。

http://jsfiddle.net/wppykb9a/2/

如果您希望它与 z-index 一起使用,它会稍微复杂一些,但您可以使用的一种方法是 document.elementFromPoint()。它返回特定点的最顶部元素,因此在放置时您可以将可拖动元素放在后面,然后检查放置点最高的可放置元素。像这样:

$(function() {
  window.a = 10;

  $(".droppable,.droppable2").draggable();

  $("#draggable").draggable({
    tolerance: 'pointer'
  });
  $(".droppable").droppable({
    accept: "#draggable",
    drop: function(event, ui) {
        var temp = ui.draggable.zIndex();
        ui.draggable.css('z-index', -1000);
        var topDroppable = document.elementFromPoint(event.clientX, event.clientY);
      ui.draggable.css('z-index', temp);
      $(topDroppable)
        .addClass("ui-state-highlight")
        .find("p")
        .html("Dropped!");
    }
  });
});

http://jsfiddle.net/17xn0zvz/

https://developer.mozilla.org/en-US/docs/Web/API/Document/elementFromPoint

【讨论】:

  • 感谢您的回答,但如果两个 droppable 都可以拖动并且它们的 z 索引在拖动时发生变化(您拖动的那个必须始终在顶部),那么在这种情况下,如果droppable 和 droppable 2 交换它们的 z 索引它将不起作用。你可以在这里看到的问题link
  • 您可以使用 document.elementFromPoint,它应该可以工作。请参阅我的编辑中的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 2019-11-07
  • 1970-01-01
  • 2016-05-16
  • 2013-01-27
  • 2011-11-27
相关资源
最近更新 更多