AJAX Post 到 Controller 操作 MVC.NET 后,jQuery UI Draggable 和 Droppable 中断

标签 jquery asp.net-mvc ajax draggable droppable

我在使用此功能时遇到问题。

情况是:

  1. 用户将项目拖动到 div
  2. 拖放时,AJAX Post 会通过项目 ID 发送到 Controller 操作
  3. 成功后,我会用从数据库检索到的 html 标记替换项目所在的 div。 .replaceWith(data) 注意:此标记是一个 div,其 ID 与项目拖放到的 ID 相同,其中包含一些附加元素。
  4. 这会加载更新后的 div。

所有这些都完美地工作,几乎,问题是我无法将不同的项目拖到 div 上。我确信这与 AJAX Post 之后加载的新 div(具有相同 ID)有关。

这是我的 jQuery 代码

$(function () {
        $('.draggable').draggable({ revert: true });
        $('#layoutHeader').droppable({
            drop: function (event, ui) {
                $.ajax({
                    type: "POST",
                    url: '/SiteSetup/GetMarkup/' + $(ui.draggable).attr("id"),
                    success: function (data) {
                        $('.draggable').draggable('destroy');
                        $('#layoutHeader').replaceWith(data);
                        $('.draggable').draggable({ revert: true });

                    }
                });
            }
        });
    });

最佳答案

使用 jQuery 和 DOM,如果您用具有完全相同 DOM id 的完全相同的 DOM 元素替换 DOM 元素(因此 id 为“div1”的 div 被另一个 id 为“div1”的 div 替换),则关联的 jQuery该 DOM 元素的数据会丢失。 jQuery 的指针实际上指向页面上不再存在的幽灵元素。

要查看证明,请在 Firefox 中启动 firebug,然后直接进入

$("#layoutHeader")

在 AJAX 发布之前和之后。两次单击控制台中返回的元素。您会注意到,第二次单击(即 POST 返回后的一次)您的 Firebug 将指向一个灰色的幽灵元素。

解决方案是稍微重构一下您的代码。试试这个

function handler(event,ui){
                $.ajax({
                    type: "POST",
                    url: '/SiteSetup/GetMarkup/' + $(ui.draggable).attr("id"),
                    success: function (data) {
                        $('.draggable').draggable('destroy');
                        $('#layoutHeader').replaceWith(data);
                        $('.draggable').draggable({ revert: true });

                    }
             $('#layoutHeader').droppable({drop: handler});
}


$(function () {
        $('.draggable').draggable({ revert: true });
        $('#layoutHeader').droppable({drop: handler});

    });

关于AJAX Post 到 Controller 操作 MVC.NET 后,jQuery UI Draggable 和 Droppable 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5313601/

相关文章:

javascript - 加载新的 AJAX 后,Isotope 容器不会以新对象为目标,而是与旧对象重叠

c# - 在 MVC 帮助程序中将参数传递给 Func<>

c# - 缩小 Asp.Net 应用程序的 Html

jquery - django.core.paginator 使用 jQuery 进行 Ajax 分页

javascript - 使用jquery通过id访问输入字段的值

javascript - 如何在 knockout 中向可观察数组中的对象添加属性并触发通知?

Jquery - 在悬停时选择多个 div

asp.net - ASP.NET MVC 是否使 Web 窗体成为传统平台?

javascript - 无法通过 Shopware 6 中的 XmlHttpRequest 请求 PageController

java - Dojo 和 Java 中的 AJAX PUSH(流)实现