【问题标题】:jQuery draggable - reactivating after returning cancel from drag eventjQuery可拖动 - 从拖动事件返回取消后重新激活
【发布时间】:2020-12-08 17:24:10
【问题描述】:

我的问题是我有一组 div。当我拖动它们中的任何一个并且它们到达侧面时(不完全是侧面,而是相当于侧面。所以它并不总是捕捉到另一个 div 的侧面,但是当它到达那一侧的坐标时,请参见图片下面)

在一定的变化范围内的另一个,它应该捕捉到另一个 div 的一侧。例如

我正在水平拖动,并且 div 将在到达 x=120 时立即捕捉到 x=100。所以在这种情况下方差是 20,它在 x=100 处执行 snap。

我正在做的是利用拖动,一旦达到 100,我将 div 强制为 x=120 并在拖动事件中返回 false。

我的问题是,由于我仍然按住鼠标左键,我无法在该点进一步拖动,也无法重新启用拖动。

当鼠标在捕捉后移动时,有没有一种方法可以撤消取消并重新激活拖动动作。

我尝试过但没有成功(假设是因为鼠标按钮仍然按住):

  1. 我尝试使用setTimeout 触发鼠标向上并单击。没用。
  2. 我尝试了JScreateEvent,我相信这实际上是一样的,但没有奏效。
  3. 我试图触发拖动事件。没用。

Google 似乎没有返回任何帮助。我觉得我现在正在用头撞墙。

任何帮助将不胜感激。

如果需要任何其他信息,请告诉我。

谢谢你, 杰夫

【问题讨论】:

标签: jquery-ui draggable jquery-ui-draggable


【解决方案1】:

由于该元素与可拖动元素不在同一平面上,因此您可以添加另一个与父元素一样高的元素。这样您就可以在 Drag 中使用 Snap 到该元素。

示例

$(function() {
  function makeHidden(s) {
    var $targets = $(s);
    $targets.each(function(i, el) {
      var $el = $(el);
      $("<div>", {
        class: "hidden"
      }).css({
        position: "absolute",
        top: 0,
        left: $el.css("left"),
        width: $el.width() + "px",
        height: $el.parent().height() + "px"
      }).insertAfter(el);
    });
  }

  $("#drag-1").draggable({
    axis: "x",
    containment: "parent",
    snap: ".hidden",
    snapMode: "outer",
    snapTolerance: 20
  });

  makeHidden(".fixed");
});
.draggable,
.fixed {
  width: 90px;
  height: 80px;
  padding: 0;
  margin: 0;
  font-size: .9em;
}

.ui-widget-header p,
.ui-widget-content p {
  margin: 0;
}

#play-pen {
  height: 280px;
  position: relative;
}

#fixed-1 {
  position: absolute;
  top: 10px;
  left: 120px;
}

#drag-1 {
  position: absolute;
  top: 120px;
  left: 10px;
}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div id="play-pen" class="ui-widget-header">
  <div id="drag-1" class="draggable ui-widget-content">
    <p>Drag 1</p>
  </div>
  <div id="fixed-1" class="fixed ui-widget-content">
    <p>Fixed 1</p>
  </div>
</div>

对于makeHidden(),您可以传入一个选择器、元素或jQuery 对象。如果传入 Selector 或 jQuery 对象,它将适用于匹配的一个或所有元素。如果您有 2 或 3 个固定元素,它将为每个元素制作隐藏项。

查看更多:

如果固定元素的数量发生变化,您可能需要将makeHidden() 移动到 Draggable 的 Start 回调中。然后在 Stop 中销毁它们。

【讨论】:

  • 感谢您的回答。这绝对是一个很好的起点,而不必重写大量代码。我会看看我是否也可以使这项工作垂直和水平地捕捉到中间。我将不得不更深入地研究 Draggable 的 snap 选项。
  • @Jeff 我希望这对您有所帮助,并且您喜欢投票或将其标记为答案。您也可以将snapMode 更改为"both" 并看到它捕捉到外边缘和内边缘。
  • 曲折再次感谢。我仍在尝试找到捕捉到元素中间的最佳解决方案。尝试了与用于外部和内部的相同方法。我正在扩展以获取有关位置等的更多数据并添加快照事件。但是,目前还没有真正的解决方案。我对您的解决方案投了赞成票,因为这是一个很好的开始。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多