【问题标题】:How to check if an element is dragged outside JQuery UI Sortable?如何检查元素是否被拖到 JQuery UI Sortable 之外?
【发布时间】:2018-08-21 09:06:02
【问题描述】:

我正在制作一个 jQuery UI sortable,我需要检测一个元素何时被拖出。听起来完全out event 的工作 - 除了我自己最初错过的一个小评论:

注意:当可排序的项目被删除时也会触发此事件。

这对我来说是一个重要的展示。每当项目只是重新排列时,被拖动的项目仍然最后会得到一个out 事件。我一直在绞尽脑汁,但到目前为止还没有。 我如何检测 out 事件是因为该项目真的被拖到外面,还是仅仅是因为拖动操作正在停止?

(如果重要,jQuery UI 版本 1.11.4)

添加:

好吧,我想我自己成了“只剩下最后一个荒谬的部分”陷阱的受害者。我试图做的是有两个可以在它们之间拖动项目的可排序对象。与the example 类似,但当项目被拖到所有可排序对象之外时,占位符会完全消失。这就是为什么我想跟踪哪些物品在里面,哪些物品在外面。

我最终解决它的方法是放弃这个“要求”。无论如何,如果占位符保留会更好,因为它会显示释放鼠标时项目将被放置到的位置 - 即使它在外面。

但是,如果我确实想保持这条路,我现在看到正确的解决方案是在 out 事件上隐藏占位符,并在 over 事件上显示它。即使开始拖动,也有over,尽管没有从外部拖动任何项目。

不管怎样,虽然这两种方法都可以解决我的真正的问题,但它们都没有真正回答我提出的问题,所以我会让它留下来。

【问题讨论】:

  • 当您遇到out 事件时,您可以查看是否存在占位符并将其删除。 over 的一部分是 ui.sender 以及 ui.position。因此,您可以找到已结束的可排序位置,如果 ui.position 在边界内,则该目标将获得占位符。

标签: javascript jquery jquery-ui jquery-ui-sortable


【解决方案1】:

我认为这是正确的答案:

var interval;
var outside = false
$(button).addEventListener('mousedown',function(e) {
    interval = setInterval(function() {
        if (outside) {
            //fire event
        }
    },1000); // 1000 ms between each frame
});
// This code will stop the interval if you move your mouse away from the field while still holding it.
$(button).addEventListener('mouseout',function(e) {
    outside = true;
    clearInterval(); //function to clear interval
});

【讨论】:

  • 嗯...所以,如果在out 之前注册了mouseup,那么忽略out?我想这是一种方式......我也在检查beforeStop - 似乎它也在out之前触发。
  • 我认为你应该在逻辑表达式中结合 mouseup 和 out
  • Ermm... 我不确定你的意思。可以举个例子吗?
  • 嗯,等一下,也许下一个方法:stackoverflow.com/questions/25180332/… 如果用户按住点击,项目会离开屏幕,而他没有点击,然后触发您自己的操作
  • 那是 Angular... 甚至不相关。 ://
【解决方案2】:

不确定我是否在这里达到目标,还有其他一些陷阱。

示例:https://jsfiddle.net/Twisty/83Lwxkrs/

JavaScript

$(function() {
  $("#sortable1, #sortable2").sortable({
    connectWith: ".connectedSortable",
    placeholder: "sortable-placeholder",
    out: function(e, ui) {
      $(".sortable-placeholder").remove();
    }
  }).disableSelection();
});

out 可用于删除占位符。因此,当拖动的项目离开时,噗,占位符消失了。当它被拖过另一个或相同的,噗,占位符被重新创建。

陷阱:将项目丢弃在任何可排序之外,该项目将一无所有。占位符被删除,被拖动的项目也是如此。我怀疑这可以通过查找 drop 或 mouse up 并在 sortable 尝试恢复位置之前重新创建占位符来解决。

【讨论】:

  • 我会尝试display:none。然而,这不是问题所在。如果它令人困惑,也许我最好删除它。
  • @Vilx- 你提到,“当项目被拖到所有可排序对象之外时,占位符完全消失”这是什么问题?这个答案解决了这个问题。
  • 这就是我想要实现的目标。事实上,起初我什至没有意识到 是我想要的。但我的是如何可靠地检测(获取事件)何时将项目实际拖到其可排序容器之外。
  • @Vilx- 要确定out 事件是否以您在帖子中提到的方式被触发,您需要将它的当前位置与它离开的元素的位置进行比较。您也可以尝试使用 .on() 并查看这两个事件。
猜你喜欢
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2013-05-29
  • 2012-02-26
  • 2010-12-13
  • 1970-01-01
  • 2011-03-18
  • 2015-08-02
相关资源
最近更新 更多