javascript - 如何用取消停止可排序事件

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

我有一个draggable 列表和一个sortable 列表。 draggable 列表将包含所有可能的项目。 sortable 列表是用户的选择。

我希望 sortablereceive 进行检查以查看该项目是否已存在,如果存在,则停止排序并还原 项目回到可拖动列表。但是,即使触发了 cancel 事件,update 事件也会继续并且永远不会发生还原。

我错过了什么?

这是 fiddle :http://jsfiddle.net/XW48M/1/

HTML:

<div class="container-fluid">
    <div class="row">
        <div class="col-md-5">
            <ul id="teams" class="list-group">
                <li class="list-group-item poll-assets" data-id="1" data-name="Team 1">Team 1</li>
                <li class="list-group-item poll-assets" data-id="2" data-name="Team 2">Team 2</li>
                <li class="list-group-item poll-assets" data-id="3" data-name="Team 3">Team 3</li>
            </ul>
        </div>
        <div class="col-md-5">
            <ul id="poll" class="list-group">
                <li id="1" class="list-group-item poll-item" data-id="1" data-name="Team 1">Team 1</li>
                <li id="4" class="list-group-item poll-item" data-id="4" data-name="Team 4">Team 4</li>
                <li id="5" class="list-group-item poll-item" data-id="5" data-name="Team 5">Team 5</li>
            </ul>
        </div>
    </div>
</div>

Javascript:

$(document).ready(function () {
    $("#poll").sortable({
        revert: true,
        update: function (event, ui) {
            console.log('update');
            var order = $("#poll").sortable("toArray");
            if ($(ui.item).hasClass('ui-draggable')) {
                $(ui.item).addClass('poll-item').removeClass('ui-draggable draggable').attr('id', $(ui.item).data('id'));
            }
        },
        receive: function (event, ui) {
            console.log('receive');
            var order = $( "#poll" ).sortable( "toArray" );
            var id = $(ui.item.data('id'));
                if ($.inArray(id, order)) {
                $("#poll").sortable('cancel');
                console.log('CANCELLED');
                return;
            } else {
                $(ui.item).remove();
            }
        }
    }).disableSelection();

    $('#teams')
        .find('.poll-assets').draggable({
        opacity: 0.75,
        appendTo: document.body,
        helper: 'clone',
        connectToSortable: '#poll',
    }).disableSelection();
});

最佳答案

我不太明白您为什么使用可拖动 + 可排序而不是 2 个连接的可排序。

所以我尝试使用这种方法,我得到了类似的东西:

$("#teams").sortable({
    revert: true,
    connectWith: "#poll",
    start: function () {
        console.log('start');
        var order = $('#poll').sortable("toArray", {
            attribute: "data-id"
        });
        $('#poll').data('order', order);
    }
}).disableSelection();


$("#poll").sortable({
    revert: true,
    receive: function (event, ui) {
        console.log('receive');
        var order = $('#poll').data('order');
        var id = $(ui.item).data('id').toString();
        if ($.inArray(id, order) != -1) {
            console.log('CANCELLED');
            $(ui.sender).sortable("cancel");
        } else {
            console.log('NOT CANCELLED');
        }
    }
}).disableSelection();

主要问题是获取正确的项目数组,因为在接收事件时,数组已经更新为"new"添加的项目。我必须将它放在另一个可排序的开始事件的数据中,并在接收事件时将其取回。

我仍然觉得有些事情不是很令人满意:

  • 在启动和接收回调中使用 id 选择器;但是事件参数不包含我需要的元素
  • 还原效果很……怪异

无论如何,这是我能达到的最接近您预期的结果;我还做了一个jsfiddle供您检查。

让我知道它是否有帮助/如果你能得到更好的东西,请发布你的代码。

关于javascript - 如何用取消停止可排序事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23813128/

相关文章:

javascript - 将两个 socket.io 客户端连接在一起(建立套接字到套接字,跨浏览器连接)

jquery - 如何在 sprite Navigation 中使用 jQuery 实现淡入淡出效果

javascript - 你如何使用 Flexigrid 处理行 onclick 事件?

jquery - 设置使用 jQuery UI 日期选择器选择的去年

javascript - 为什么我的 jQuery-UI 脚本不能在 Greasemonkey 中执行?它在 Firebug 控制台中运行

javascript - 有人可以解释一下 function($) 在 jQuery 中的作用吗

javascript - 如何补偿仍在进行中的数组迭代中已删除的元素?

javascript - 需要帮助使用 CSS 调整图像网格大小

javascript - 学习 Jasmine - toHaveBeenTriggered 适用于触发器 ("modal"),但不适用于 modal()

javascript - 从 Jquery 1.11.0 和 Jquery UI 1.10.4 升级到 Jquery 3.x 和 Jquery UI 1.12.x 时测试向后兼容性问题