【问题标题】:JQuery UI, Combining Sortable with DroppableJQuery UI,结合Sortable和Droppable
【发布时间】:2010-08-13 19:39:09
【问题描述】:

我正在尝试将 JQuery UI sortabledroppable 结合起来,以创建多个页面来放置和排序内容。我在这里设置了一个带有独立演示的博客条目:

http://whit.info/blog/2009/06/06/jquery-ui-combining-sortable-with-droppable/

这是一个 jsFiddle:

http://jsfiddle.net/VUuyx/

请注意,您可以拖动以对框进行排序,甚至可以拖动到其他列中。您也可以单击页面按钮来切换页面。我的问题在于结合这两个功能:

通过使用 droppable,我允许用户将一个框拖到一个 page 按钮上,然后页面将切换,用户可以完成将其拖到新公开的页面。问题是当页面切换时,出现在拖动框下方的第一列没有触发 over 事件。您必须拖动到另一列,然后回到第一列才能显示占位符。

我不确定,但我认为我需要以某种方式清除事件,或者手动触发它们。问题似乎源于这样一个事实,即当它可见时,拖动的框在列上方。

你能帮助解决这个深奥的难题吗?

谢谢!

更新:

所以我一直在考虑可能的解决方法。 Michal 建议触发 refresh 方法,确实没有解决问题,但让我想到了事件问题。

似乎当您将鼠标移开然后再返回时,会触发正确的事件。也许如果我可以手动触发第一列的 mouseout 事件,重置将允许 mouseover 事件正确触发。

我试过了:

$(".column:first").trigger('mouseout'); 

但我认为这与 sortable 的 out 事件不同。或许我应该触发那个事件?

【问题讨论】:

  • +1 对“困境”一词的使用相当不错。每个人都称他/她的问题为“两难”,即使问题有三四个方面。
  • 没有什么比四元问题更糟糕的了。 :)
  • $('.column').sortable('refresh'); 添加到droppable 的.over 回调有帮助,但不一致。我不知道如何让可排序的项目一直出现在列的顶部。
  • 仅供参考,这在 IE7 中根本不起作用
  • +1 表示问题,同时也表示将我介绍给jsfiddle。这是一个很好的沙盒,可以尝试新功能并与他人讨论,或者在寻求帮助时显示您的代码和结果。

标签: javascript jquery jquery-ui


【解决方案1】:

也许我误解了这个问题,但我认为它与“页面切换”无关。如果同时打开两个页面并尝试将“Box 1”拖到“Box 4”上方的位置,您会看到它不会触发“Box 4”的Sortable收到Draggable,直到你去下面“盒子4”。这不能解决您的问题,但可能会帮助您寻找更好的解决方案。

请参阅 http://jsfiddle.net/nkBNP/7/ 以获取 JSFiddle 来说明我的意思。

【讨论】:

  • 你是对的。我似乎根本不关心页面切换。
  • 问题似乎是你不能从上往下掉(或者从上往下它不会到最高项目上方的位置)。
【解决方案2】:

至少对于自上而下的下拉,我认为解决方案是将框类设置为 draggable 并将其链接到可排序对象。

$(".box").draggable({
    tolerance: 'point',
    connectToSortable: '.column',
    snap:false,
    helper : 'clone',
});

这个例子创建了一个盒子的副本,但它确实允许我将盒子 1 拖到第 2 页,然后慢慢地将它拖到盒子 5 上方,然后放到顶部。虽然它非常敏感。您可能需要调整网格并捕捉以使其对临时用户始终如一地工作。

我当然可以想象一个可排序的对象不会期望某些东西从顶部下来,因为它期望从容器内对事物进行排序。另一方面,Droppable 期望事物从任何方向进入。

【讨论】:

    【解决方案3】:

    是的,添加 $('.column').sortable("refresh"); 到 show_page(id) 函数结束对我有用(仅在 firefox 雷区测试):

    function show_page(id) {
        $('.page').removeClass('page_active');
        $('#page_'+id).addClass('page_active');
        $('.column').sortable("refresh");
    }
    

    【讨论】:

    • 不适合我。 Firefox 和 Chrome 对我来说都有相同的行为(即使刷新):当页面切换时,框不能放在第一列的第一个位置。占位符不显示。有时它会出现在第二个位置,但要让它进入第一个位置,您必须将鼠标移开然后再返回。这是截图:bit.ly/dmxl6T
    • 对不起,它没有用,我也刚刚在 chrome 中进行了测试,修复也对我有用。也许在不同的平台或版本上会有所不同(我在 ubuntu 中使用的是 chrome 和 firefox 的夜间版本)。
    【解决方案4】:

    将@edtechdev 的答案添加到tolerance: 'intersect 产生了一些我认为可能会让你满意的东西,Whit:

    $(".column").sortable({
        connectWith: '.column',
        opacity: 0.4,
        tolerance: 'intersect', //<--changed
        placeholder: 'place_holder',
        helper: function(event, el) {
            var myclone = el.clone();
            $('body').append(myclone);
            return myclone;
        },
    }).disableSelection();
    
    // ...
    
    function show_page(id) {
        $('.page').removeClass('page_active');
        $('#page_'+id).addClass('page_active');
        $('#page_'+id).find('.column:first').sortable('refresh'); //<- added
    }
    

    【讨论】:

      【解决方案5】:

      【讨论】:

        【解决方案6】:

        Sortable 有一个未记录的选项refreshPositions,当它们也可排序时,它会自动更新您的 droppable 的位置。这可以防止占位符可放置而不是实际可放置。

        【讨论】:

        • 你有如何使用 refreshPositions 的例子吗?
        猜你喜欢
        • 2011-07-26
        • 2014-03-23
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 2012-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多