0

我有用户选择的行列表,我想一一删除它们并最终显示结果。

显然,如果我只是做简单的循环并每次调用 ajax 函数,但是我如何循环并检查哪个成功,哪个失败以及它们何时完成?

你会怎么做?进行批量编辑/删除的正确方法是什么?

4

1 回答 1

9

每个 ajax 请求都会有与之相关的开销。对每一行进行调用不是一个好主意,因为它可能会使服务器的请求超载,并且如果您收到足够的流量,您可以自己进行 DoS 。此外,所有浏览器对一次可以发出多少个 HTTP 请求都有限制,因此(取决于浏览器),即使您告诉它们一个接一个地执行,删除也会突然发生,而不是一次全部发生。

您最好的选择是将要编辑/删除的行分组到 JSON 数组中,并在单个请求中将它们发送到服务器。然后,您可以在服务器上解析 JSON 并相应地删除项目。完成后,返回一个包含结果的 JSON 数组。

此 jQuery 伪代码假定您使用原生JSON 对象定位浏览器,或者您正在使用json2.js。基本上,这段代码只是在您向用户显示的表格的每一行中查找“隐藏的 ID”字段,并将其添加到数组中。您可以根据需要进行调整。

var recordsToDelete = [];
$("tr.myRow").each(function() {
    var id = $(this).find("input:hidden").val();
    recordsToDelete.push(id);
});
var json = JSON.stringify(recordsToDelete);

处理结果可能更难。您应该设计您的系统,以便(如果成功)删除每一行。除非您正在处理一个非常复杂的系统,否则您永远不应该遇到某些行通过而某些行失败的情况。如果发生这种情况,您需要重新考虑您的系统架构。jQuery 有事件successfailure您可以使用这些事件来处理请求的一般成功或失败,我建议您使用它。

继续上面的代码,这是处理删除记录的一种方法。complete为简单起见,我在这里使用事件,但如果可能,您应该使用successandfailure事件。complete无论请求成功还是失败,事件总是会发生。

$.ajax({
    url: "http://stackoverflow.com/questions/1653127",        
    type: "POST", // Always use POST when deleting data
    data: { ids: json },
    complete: function(xhr, status) {
        var response = JSON.parse(xhr.responseXML);
        // Response will be an array of key/value
        // pairs indicating which rows succeeded or failed
        for (var i = 0; i < response.length; i++) {
            var recordID = response[i].recordID;
            var status = response[i].status;
            // Do stuff with the status codes here
        }
    }
});

回应评论:

  • 对于像 gmail 这样的应用程序,它的工作方式非常复杂,以至于说“我会这样做,因为 Google 这样做”并不是一个好主意。并非所有适用于 Google 的东西都适用于所有公司或网站。像谷歌这样的公司需要处理几乎没有其他网站需要担心的问题。但是要回答您的问题
    • 我刚刚验证了这一点以确定:GMail 使用一个带有一组 ID 的 AJAX 请求。没有单独的状态代码被发回。看起来(我在这里推测)Gmail 会为您刚刚执行的操作返回一个“操作 ID”,因此您可以通过单击删除电子邮件后短暂显示的撤消链接来撤消该操作。
    • 在开发应用程序时,您通常希望使其足够可靠以确保操作不会失败。您应该执行严格的 QA 以确保这一点。基本上,删除操作应该作为一个整体通过或失败。可能发生这种情况的一种情况是,如果用户在您的服务器出现故障时单击删除。对用户而言,该站点仍处于运行状态,因为您没有重新加载页面,但 AJAX 请求将失败,因为它无处可去。你会想要处理这样的事情。
    • 这实际上取决于您的应用程序的业务规则。如果您的应用程序在多人可以同时更改记录的情况下使用(只是一个示例),那么一个用户尝试删除的内容可能在其他人单击“删除”按钮之前就已被删除。在大多数情况下,我看不到有人在乎谁先删除了记录,因为如果它被删除,它就被删除了,不管是谁真正做的。但是,业务规则可能会规定(尽管可能很荒谬)您需要将此信息报告给用户。在这种情况下,您必须为每次删除返回状态数组。
  • 为了防止黑客删除其他人的记录,有几件事要做:
    • 对待您的 AJAX 处理程序与网站的其他部分没有区别。他们不应该获得任何特权。对 AJAX 处理程序的请求应该像其他所有内容一样经过身份验证。
    • 将 POST 请求(正如我在示例中提到的)用于破坏性操作或更改数据的操作。这将使黑客更难执行跨站点请求伪造(CSRF)。显然这不是万无一失的事情,但它阻止了简单的攻击。
    • 显然,不要仅仅因为用户发送了删除请求就认为用户有权删除记录。确保您确认执行删除的用户有权删除每条记录。您如何执行此操作将取决于您的服务器端应用程序。
    • 确保对从客户端发送到服务器的所有值进行编码。这将防止 SQL 注入。
    • 确保您熟悉OWASP 前十名列表。它涵盖了网站上最常见(但不是全部)的主要漏洞,并解释了如何防止成为它们的受害者。
于 2009-10-31T02:19:52.530 回答