【问题标题】:jQuery UI sortable - overlapping by 50% doesn't seem to workjQuery UI 可排序 - 重叠 50% 似乎不起作用
【发布时间】:2015-08-04 19:42:07
【问题描述】:

jQuery UI sortable 插件旨在使一组 DOM 元素可排序。一个不错的demo在官网here

API documentation 提供了tolerance 选项,描述中说:

指定使用哪种模式来测试正在移动的项目是否悬停在另一个项目上。可能的值:相交、指针

此外,intersect 的描述(默认)状态:

相交:该项目与另一个项目重叠至少 50%。

我预计,如果我拖动一个项目并将其移到另一个项目上,它会在 50% 的高度重叠时检测到我正在重新排序这些项目。但这似乎不起作用:(。即使您查看官方demo,并且尝试将第一项拖动到第二项上,您也会看到必须将第一项拖动整个高度,如其高度的 100%,超过第二个元素,然后才交换项目的顺序。

我错过了什么吗?作为一名程序员,我有什么办法可以强制插件按照我的预期工作吗?我希望用户将第一项仅向下移动 50% 的高度,以便插件检测重叠并执行重新排序。

【问题讨论】:

  • 对不起,你在那里改变了答案。我将答案切换回您之前接受它时的方式。我保留了参考网格(常见问题)查看此问题的任何人的额外信息,因为我相信它很有帮助并提供 50% 的重叠功能(块被插入,而不是交换),所以从这个意义上说,它确实如小提琴。谢谢。

标签: javascript jquery jquery-ui


【解决方案1】:

简短的回答是:

为此有一个bug ticket,所以似乎唯一的选择是某种形式的解决方法。

这是使用自定义排序功能的a workaround example,它似乎更好地回答了您的问题。我将保留下面的示例以另一种解决问题的方法。

...

这涵盖了单一方向的情况,但是如果你想实现一个网格呢?

这是我编辑的解决方法小提琴(带插入的网格示例):fiddle

注意这不会交换块,它会插入它们并将其余的推回。

这里是模拟 50% 覆盖率的 javascript / jQuery 代码片段:

var height = $(".tab").height();
var height = $(".tab").width();

    $('#pointer').sortable({
        cursorAt: { top: height/2, left: width/2 },
        containment: 'parent',
        tolerance: 'pointer'
    });

【讨论】:

  • 我可以看到它的实际行为。但我坚信这种行为是不正确的。容差:指针应该关心鼠标光标的位置。但是据我了解 DOC,宽容:相交不应该。我的问题是,(作为程序员)我能做些什么来使我的可排序元素的行为符合我的预期。
  • 我已经编辑了我的问题,以便更好地解释我的问题。我不是在问作为用户点击哪里。作为一名开发人员,我想问一下,我能做些什么来让它以我的方式为其他用户工作。
  • 谢谢。提供的带有 cursorAt 的解决方案仅将拖动的项目移动到光标下,因此就好像用户将其拖动到特定位置一样。使用 top:0 就像我们单击最顶部像素处的项目一样。这实际上并不能解决问题。
  • 非常感谢您在这里帮助我。我测试了你的小提琴,但它没有按我的意愿工作。如果我拖动第一个项目而不管鼠标光标的位置,我必须将它拖动到项目的整个高度,以便与第二个交换。我只想将它拖动到其高度的 50%。
  • 我不明白为什么你编辑了一些根本不起作用的解决方案的答案:) 你之前的答案解决了这个问题 - 如上所述为 jquery-ui 插件提供自定义“排序”功能解决方法对我有用。
【解决方案2】:

查看小部件的代码,您会发现:

if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
                    this._rearrange(event, item);
                } else {
                    break;
                }

所以,由于您指定了容差:“相交”,this._intersectsWithSides(item) 接受它。

函数 _intersectsWithSides(item) 在这里定义:

_intersectsWithSides: function(item) {
        var isOverBottomHalf = this._isOverAxis(this.positionAbs.top +
 this.offset.click.top, item.top + (item.height/2), item.height),
            isOverRightHalf = this._isOverAxis(this.positionAbs.left + 
this.offset.click.left, item.left + (item.width/2), item.width),
            verticalDirection = this._getDragVerticalDirection(),
            horizontalDirection = this._getDragHorizontalDirection();

需要“item.height/2”和“item.width/2”

您可以使用您的 on 函数并重新定义此行为:

_myIntersectsWithSides: function(item) {
        var isOverBottomHalf = this._isOverAxis(this.positionAbs.top +
 this.offset.click.top, item.top + (item.height/5), item.height),
            isOverRightHalf = this._isOverAxis(this.positionAbs.left + 
this.offset.click.left, item.left + (item.width/5), item.width),
            verticalDirection = this._getDragVerticalDirection(),
            horizontalDirection = this._getDragHorizontalDirection();

这会给你 20%(100/5 而不是 100/2)的宽度和高度。

由代码定义的“50%”。-

希望有帮助

【讨论】:

  • 非常感谢您的解释。我可以看到 50% 是由代码定义的。但我抱怨它不起作用:] 用户必须将项目拖动到高度的 100%,而不是 50,才能交换它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
相关资源
最近更新 更多