【问题标题】:Why does Draggable object have slow placeholder?为什么 Draggable 对象的占位符很慢?
【发布时间】:2013-12-09 12:47:05
【问题描述】:

我真的没有问题,但是我注意到有时 Draggable 对象的占位符很慢。

我做了这个测试:http://jsfiddle.net/X3Vmc/

    $(function () {         
        $("#myproducts li").draggable({
            /*appendTo: "body",*/
            helper: "clone",
            connectToSortable: "#mylist",
            tolerance: "pointer"
        });
        $("#mylist").sortable({
            placeholder: "sortable-placeholder", 

            over: function () {
                console.log("over");

            },
            out: function () {
                console.log("out");
            }
        });
    });

在可拖动对象中添加列表对象很容易,但当我尝试在可拖动对象中移动元素时,我发现红色占位符移动缓慢。

我的意思是有时水平移动一个元素,占位符会保留更多时间来移动(以更新其位置)。我必须在新位置周围移动鼠标以更新占位符的位置。我想让它更具反应性。这可能吗?

编辑:

看一下图片。正如你所看到的,我正在第一个和第二个位置之间移动一个元素(从第四个位置)。如您所见,占位符离那里很远。

编辑 2:

我正在使用 * Chromium 30.0.1599.114 Ubuntu 13.10 (30.0.1599.114-0ubuntu0.13.10.2)*

【问题讨论】:

  • 浏览器和版本可能是特别相关的细节来考虑这样一个问题?在 Chrome 31.0 中对我来说效果很好。
  • @ThomasW 请看一下图片。我还编辑了添加浏览器信息的问题。
  • 你是对的,在“Sortable”中重新排序块很笨重。如果从一开始就将块构建到列表中而不是被拖到那里,它是否像这样笨重? jQueryUI 示例看起来并不像这样笨重。
  • @thenewseattle -- 如果您将块从“我的列表”拖到“我的可排序”中,然后尝试在“我的可排序”中重新排序,这看起来很笨重。这是 OP 询问的症状。
  • @ThomasW 正是我所做的。它在 Chrome 中运行良好!

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


【解决方案1】:

如果您在 Sortable 对象中添加一个空的 <li></li>,您有权解决问题。

我认为这是一个可行的解决方案,无论出于何种原因,Sortable 对象在初始化可排序对象时只需要一个可排序项目。我相信答案的核心是:The sortable needs to know what kind of elements it is going to be sorting when initialized in order for the placeholder to work properly. Therefore if you are going to be sorting li elements, you should initialize the sorter with at least 1 li element in the Sortable object.

我相信是这种情况,因为我尝试将空的 <li> 替换为空的 <div>,但这并没有解决问题。

您的解决方案目前只有两个小问题。拖动可拖动对象时仍会考虑空的<li>。可以看到,draggable 可以排序到empty li 的左侧和右侧,这看起来很有趣。您也可以拖动empty li,这可能会引起一些混乱。

但幸运的是,解决此问题的方法非常简单。 li 只需要在初始化时处于可排序状态。之后我们可以将其删除,一切正常!

HTML - 可使用 li 元素排序。

<ul id="mylist">            
    <li></li>       
</ul>

jQuery

$(function () {         
    $("#myproducts li").draggable({
        /*appendTo: "body",*/
        helper: "clone",
        connectToSortable: "#mylist",
        tolerance: "pointer"
    });
    $("#mylist").sortable({
        placeholder: "sortable-placeholder"     

    });
    $("#mylist").empty();  //remove the empty li - only needed for initialization
});

FIDDLE

【讨论】:

  • 感谢您的精彩解释。我会听从你的建议。谢谢
【解决方案2】:

我假设来自“Draggable”的处理程序仍然附加,并且不同意/导致“Sortable”处理程序出现故障。这导致缺乏响应能力。

在将处理程序放入 Sortable 后摆脱处理程序,或者完全克隆/重新创建 DOM 元素 - 可能通过将 innerHtml 复制到新的 DOM 元素或类似的方式。

【讨论】:

  • 但这很奇怪,因为你可以看到我使用“克隆”作为 halper,它应该创建一个新元素吗?
  • Thomas,我注意到如果我在 Sortable 对象中添加一个空的
  • ,我看不到任何错误!嗯,这应该是一个解决方案吗?
【解决方案3】:

在我的例子中,当 sortable 是 Flexbox 容器时,问题就出现了。

可排序对象是否填充项目都没有关系,无论是&lt;div&gt;&lt;li&gt; 还是&lt;something-else&gt;

示例:http://jsfiddle.net/X3Vmc/27/


jQuery UI 问题跟踪器

事实证明,jQuery UI 论坛上已经打开了与在 sortables 中使用 flexbox 相关的错误报告: https://bugs.jqueryui.com/search?q=flexbox

很遗憾,我无法创建一个新的 https://bugs.jqueryui.com/newticket :(

嘿,jQuery UI 团队的任何人,如果你读到了这篇文章,请解释一下为什么你还在使用 90 年代那个丑陋的论坛而不是 GitHub Issues?

这个问题很烦人,因为我们到处都有 flexbox 项目


解决方法

是的,有一个丑陋、肮脏的解决方法:

http://jsfiddle.net/X3Vmc/28/

除非问题已由 jQuery UI 团队解决,或者有人贡献并提出拉取请求,否则永远不要将可拖动对象与可排序对象联系起来。

即使您只有一个可拖动对象,也可以用 div 包装它,将其初始化为可排序并将 div 连接到其他可排序对象。它将表现得像可拖动的并且可以正常工作。


有缺陷的 jQuery UI 可排序

不幸的是,在 sortables 中徘徊了几次之后,出现了一个新问题,请参见图片。

所以我必须重申我的解决方法:不要将 jQuery UI Sortable 与 Flexbox 容器一起使用。好吧,有一个杂物,只需将这个可怕的 sh*t 添加到可排序的选项中:

stop(event, ui) {
    ui.item.css('display', '')
},

换句话说,清理它之后留下的sh*t

示例:http://jsfiddle.net/X3Vmc/29/

说真的,是时候考虑搜索替代库而不是使用那些过时的废话了。

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签