jQuery ajax,附加数据工作,但数据对另一端(计算机/用户)可见吗?
Posted
技术标签:
【中文标题】jQuery ajax,附加数据工作,但数据对另一端(计算机/用户)可见吗?【英文标题】:jQuery ajax, appending data work but will the data be visible to other end(computer/user)? 【发布时间】:2016-04-05 20:00:32 【问题描述】:代码:
$(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。我的问题是:附加数据后,数据对另一端(计算机/用户)是否可用/可见?或者在附加数据之后,我是否必须添加 set setInterval 函数以每 10 秒加载一次评论 div。因此,如果有人 cmets 然后 10 秒后评论将对其他用户可见。它 加载所有 cmets div 可能会有开销。
我们看到 facebook 状态更新的情况相同。当某人更新他的状态或 cmets 时,其他所有朋友都可以看到 cmets。我们在 *** 通知中看到了这样的例子。如果有人接听或接听电话,我们会立即收到通知。它是如何完成的?如何让其他用户可以看到数据?
我们将非常感谢您对这种情况的解释。
【问题讨论】:
这些由sockets
完成,为您提供实时数据更新。如果没有套接字,则必须使用 ajax
,但它会增加服务器的负载,因为它每 10 秒间隔调用一次服务器。
这可能会帮助你smashingmagazine.com/2012/05/…
是的,setInterval 10 seconds 不是我认为的解决方案。为所有要加载的 div 设置 setInterval 不是一个好主意。
你能发布示例代码或解释更多关于加载cmets或状态的方法吗?
我建议您使用parse.com 使用他们的 API 和服务(免费但有非常大的限制),您可以很容易地制作这种类型的应用程序。如果您决定要使用它,可以找到简单的设置指南here
【参考方案1】:
通过使用 setInterval 函数,所有用户都必须每 10 秒重新加载评论部分,这是一种不好的做法,对您的服务器来说不是最佳设置。然而,这是最简单的解决方案。
最好的解决方案是套接字,当一个用户发表评论时,一个套接字会通知其他用户,反之亦然。在http://www.socket.io/ 获得战利品。您必须创建一个应用程序,让所有用户在其中收听指定的功能,如果一个用户发表评论,将通知其他用户。这是解决此问题的一种轻量级方法,因为只有在用户发表评论(向函数发送信号)时才会更新 cmets。
希望这会有所帮助。干杯
【讨论】:
解决这个问题的重量级方法是什么? socket.io 是否适用于状态更新系统? heavyweight 是 setInterval 方式,因为所有用户必须每 10 秒重新加载评论部分。它易于配置,但对服务器来说很重。是的,socket.io 也适用于状态更新,你可以按照你喜欢的方式配置它。 或者,一个重量级的解决方案可能是实现类似 meteor.com 的东西(请原谅 necrobump)【参考方案2】:您必须使用 setInterval 函数。您可以将版本号与数据库端的每个注释关联,而不是加载所有 div 元素。更新评论时,您将增加版本号。因此,当 setInterval 到达后端并传递其 versionId 时,您可以从版本差异中确定并发送一个标志,该标志将告诉视图要更新哪些 div 以及不处理哪些 div。
【讨论】:
【参考方案3】:正如其他人所建议的,更好的做法是www.sockets.io,而简单的做法是setInterval
。我只会对此添加一些要点,您可能会考虑:
1) 您希望有多少用户,如果您希望应用程序被大量用户使用,那么甚至不用担心 setInterval
2) 如果您需要针对少量用户的应用程序并且您发现 sockets.io 难以实现(在第一次出现时可能看起来很可怕),您可以考虑下一种方法:
不要加载所有 div,而是使用唯一的 id 或时间戳,并且每 10 秒仅将其发送到服务器。如果服务器报告在讨论中有比唯一 ID 更新的项目,则返回“OK”消息,可以评估该消息以下载新内容。这样,您可以使用“更简单”的 setInterval 方法,同时尽可能限制服务器负载。【讨论】:
【参考方案4】:如果用户数量较少,setInterval 可能会有所帮助。
无论如何,每次开始检查时都必须销毁 ajax 事件。
setInterval(function()
$check_for_new_chat.destroy();
$check_for_new_chat = $.ajax(
...
);
,10000);
通过这种方式,您可以减少服务器负载。
【讨论】:
【参考方案5】:正如其他人所说最好使用 WebSockets 但在此说明中,这也意味着您可以删除 AJAX Post,因为您可以使用 WebSocket 服务器为您处理该请求,然后将通知发送给其他人消息内容。
需要注意的事项,如果您的系统永远不会被使用的用户数量,超过 10 人符合您关于必须使用 SetInterval 和 AJAX 的正确假设。
如果您希望 WebSockets 经常有超过 10 个用户,原因很简单,WebSockets 在打开页面时会增加客户端负载,因为 AJAX 在打开页面后只需 10 秒。如果您使用 ASYNC,您的用户甚至不会注意到它。
Web Sockets 有一点初始负载,因此取决于您启动套接字客户端的方式和时间,您的用户可能会注意到轻微的延迟。
借助 AJAX,您还可以使用 PHP SESSION 系统来了解哪些用户使用 WebSockets 发布了什么内容,但要验证谁发布了什么内容并确保他们确实发布了并且有人没有向您的 WebSocket 服务器发送垃圾信息会有点困难。
因此,请了解您的受众特征,人们会发表评论的可能性有多大,以及有多少用户将使用这个系统,所有这些信息都与做出决定有关。
如果您确实选择使用 WebSockets 路线,请确保您正确规划了安全性。例如,当用户加载页面时,在数据库中为 Web 套接字服务器保存一个令牌,并且每 1 分钟让套接字客户端保持该令牌存活 2 分钟。之后删除任何过去过期的令牌,您可以通过 crontab 执行此操作,也可以通过由您决定的页面加载来执行此操作。
【讨论】:
以上是关于jQuery ajax,附加数据工作,但数据对另一端(计算机/用户)可见吗?的主要内容,如果未能解决你的问题,请参考以下文章