jQueryajax,附加数据有效,但数据对另一端(计算机/用户)可见

jQuery ajax, appending data work but will the data be visible to other end(computer/user)?

本文关键字:数据 计算机 用户 可见 有效 jQueryajax      更新时间:2023-09-26

整个项目和代码稍后将托管到php、mysql托管服务器。

代码:

$(document).ready(function(){
    console.log('hello');
    $('input[name="nm_submit_comment"]').on('click', function(e){
        e.preventDefault();
        var frm = $(this).closest("form");
        var frm_id = frm.attr("id");
        var frm_id_splitted = frm_id.split("_");
        var frm_id_splitted_2 = frm_id_splitted[2];
        var frm_serialized = frm.serialize();
        $.ajax({
            url: "save-comment.php",
            method: "POST",
            data: frm_serialized,
            success: function(data) {                    
                data = JSON.parse(data);                    
                $('div#id_div_comment_' + frm_id_splitted_2).append('<div class="cl_div_comment_content">' + data.nm_textarea_comment_content + '</div>');
                $('textarea.cl_textarea_comment_content').val("");                  
            }
        });
    });
});

jQuery ajax运行良好。它将数据保存到数据库中,然后将数据附加到div中。我的问题是:附加数据后,数据对另一端(计算机/用户)是否可用/可见?或者,在添加数据后,我必须添加setInterval函数,每隔10秒加载一次注释div。因此,如果有人发表评论,那么10秒后,其他用户就会看到该评论。它加载所有评论可能会有开销div.

我们在facebook状态更新中看到了同样的情况。当有人更新他的状态或评论时,其他所有朋友都可以看到评论。我们在stackoverflow通知中看到了这样的例子。如果有人回答或评论,我们会立即收到通知。它是如何完成的?如何使数据对其他用户可见?

对这种情况的解释将不胜感激。

通过使用setInterval功能,所有用户必须每10秒重新加载一次注释部分,这是一种糟糕的做法,对服务器来说不是最好的设置。然而,这是最简单的解决方案。

最好的解决方案是套接字,当一个用户发表评论时,套接字会通知其他用户,反之亦然。在http://www.socket.io/.你必须创建一个应用程序,让所有用户都能收听指定的功能,如果一个用户发表了评论,其他用户将收到通知。这是解决这个问题的一种轻量级方法,因为只有当一个用户发表了评论(这会向函数发送信号)时,评论才会更新。

希望这能有所帮助。Cheers

您必须使用setInterval函数。您可以将版本号与数据库端的每个注释关联起来,而不是加载所有div元素。当注释更新时,您将增加版本号。因此,当setInterval到达后端并传递其versionId时,您可以根据版本差异确定并发送一个标志,该标志将告诉视图哪些div要更新,哪些不更新。

正如其他人所建议的,更好的做法是www.sockets.io,简单的做法是setInterval。我只想补充几点,你可以考虑一下:

1) 你预计会有多少用户,如果你预计应用程序会有大量用户使用,甚至不用担心setInterval

2) 如果您需要少量用户使用该应用程序,并且您发现sockets.io很难实现(在第一次本地化时可能看起来很可怕),您可能会考虑下一种方法:

  • 不用加载所有div,而是使用一个唯一的id或时间戳,每10秒只将其发送到服务器。如果服务器报告讨论中存在比唯一id更新的项目,则返回一条"确定"消息,可以评估该消息以下载新内容。通过这种方式,您可以使用"更简单"的setInterval方法,但也可以尽可能地限制服务器负载

如果用户数量较少,则setInterval可能会有所帮助。

不管怎样,每次开始检查时都必须销毁ajax事件。

setInterval(function(){
  $check_for_new_chat.destroy();
  $check_for_new_chat = $.ajax({
  ...
 });
},10000);

通过这种方式,您可以减少服务器负载。

正如其他人所说,你最好使用WebSockets,但在这一点上,这也意味着你可以删除AJAX Post,因为你只需要使用WebSocket服务器为你处理该请求,然后将通知与消息内容一起发送给其他人。

需要注意的是,如果你的系统永远不会被使用,那么用户的数量,超过10个人会同意你关于必须使用SetInterval和AJAX的正确假设。

如果你预计有10个以上的用户经常使用WebSockets,原因很简单。WebSockets在打开页面时会有更多的客户端负载,因为AJAX在打开页面后只有10秒。如果你使用ASYNC,你的用户甚至不会注意到它

Web套接字有一点初始负载,因此根据套接字客户端的启动方式和时间,用户可能会注意到轻微的延迟。

使用AJAX,您还可以使用PHP SESSION系统来了解哪些用户使用WebSockets发布了什么内容。要验证谁发布了什么,并确保他们确实发布了内容,并且有人没有向您的WebSocket服务器发送垃圾信息,会有点困难。

因此,请了解您的人口统计数据,人们发表评论的可能性有多大,有多少用户将使用该系统——所有这些信息都与决策有关。

如果您确实选择走WebSockets路线,请确保您正确规划了安全性。例如,当用户加载一个页面时,在数据库中为websockets服务器保存一个令牌,并每隔1分钟让socket客户端保持该令牌有效,比如说保持2分钟。在删除过去过期的任何令牌之后,您可以通过crontab执行此操作,也可以通过页面加载执行此操作。