【问题标题】:Method for disabling a jquery sortable while awaiting an ajax update?等待ajax更新时禁用jquery可排序的方法?
【发布时间】:2011-11-30 03:38:53
【问题描述】:

我有一个可排序的 jquery,它带有与更新事件相关的 ajax 回调。 ajax 回调将更新的排序顺序发送回服务器,然后刷新可排序以确保客户端和服务器都同步。

我遇到的问题是用户可以在 ajax 调用完成之前启动一个新的可排序事件 - 我想阻止这种情况。

我所做的尝试是在更新事件上禁用可排序,然后在 ajax 调用返回时重新启用它。但是,除非我弄乱了顺序,否则这似乎不起作用 - 我仍然可以在 ajax 调用仍处于活动状态时开始新的可排序拖动。

还有其他方法可以防止这种情况吗?我当然可以设置一个全局 javascript 变量,上面写着“嘿,现在不行,我正在 ajaxing ......”并引用它,但我不确定哪个可排序事件会检查这个,或者它会如何杀死可排序的点击请求。

想法?

【问题讨论】:

  • 我怀疑的一件事是您是否可以禁用当前处于活动状态的可排序。换句话说,我可以在它自己的更新方法中禁用可排序吗?
  • 这是一个超级老问题,但你还记得你是否尝试过element.sortable('option', 'disabled', 'true')而不是element.sortable('disable')吗?如果是这样,它是否比另一个更有效?

标签: ajax jquery-ui jquery-ui-sortable


【解决方案1】:

为了更好的用户体验...

您应该取消之前的 ajax 请求,而不是禁用接口,这样它就不会覆盖任何新请求。

这使界面保持响应、流畅和灵活。 它允许用户“改变主意”并在等待保存时重新排列列表。 任何旧请求都会被取消,因此不会覆盖新请求...

    //keep track of ajax request to allow cancellation of requests:
    var ajaxRequest = null;

    $('ul.sortable').sortable({
        containment: 'parent',
        update: function (event, ui) {

            //display your loading anim gif

            //get list of ids in correct order:
            var ids = $(this).sortable('toArray').toString();

            //cancel any previous ajax requests:
            if (ajaxRequest) {
                ajaxRequest.abort();
            }

            //post order to web service:
            ajaxRequest = $.ajax({
                type: 'POST',
                url: 'somewebservice.blah',
                data: ids,
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                success: function (response) {
                    //saved ok:
                    ajaxRequest = null;

                    //hide your loading anim gif
                }
            });
        }
    });

【讨论】:

    【解决方案2】:

    您可以简单地在整个列表上覆盖一个绝对定位的透明 div,这将防止列表上的任何点击/拖动。

    在您的 CSS 中将其设置为 display: none。然后,当您发起 AJAX 调用时,将其设置为 display: block,当您的 AJAX 调用完成时,将其切换回 display: none

    【讨论】:

    • 啊我应该提到我已经有一个小的“请稍候...”显示在药物项目上。您的建议会起作用,因为它实际上会在整个列表上设置一个盾牌。
    • 我最终使用了这种方法,尽管我认为它有点杂乱无章。在我看来,对于这种情况,应该能够有效地禁用和启用可排序,但是直接调用禁用可排序(通过 jqueryui.com/demos/sortable/#method-disable)似乎在全部。
    【解决方案3】:

    您是否尝试设置 disabled 属性?

    $('#sortable').sortable('option', 'disabled', true )
    

    然后在ajax请求之后

    $('#sortable').sortable('option', 'disabled', false )
    

    【讨论】:

    • 我没有使用该调用明确禁用/启用,而是使用 $('.my-list').sortable('enable');和 $('.my-list').sortable('disable');
    • 哦,看看 API,我不认为你使用的是正确的用法。 jqueryui.com/demos/sortable/#option-disabled。你似乎在做的是重新初始化它,参数也需要是一个对象而不是字符串。
    • 请参阅jqueryui.com/demos/sortable/#method-disable 以通过方法禁用/启用。我刚刚在上面添加了一条评论,但是可排序可以在它自己的更新事件处理程序中禁用自身吗?
    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2010-11-07
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多