Javascript 如何检测页面是否应该更新?

Javascript 如何检测页面是否应该更新?,javascript,jquery,ajax,database,http,Javascript,Jquery,Ajax,Database,Http,我在页面中有一个表格,显示摘要数据。 这些数据来自汇总数据库表。如果基础表得到更新,我需要刷新页面中显示的此表。 我知道的方法是每X秒重新加载一次页面。 但我感兴趣的是在表实际更新时更新表。 这方面的标准解决方案是什么?我所能想到的唯一方法是向表中添加一些额外的列,以更新行ID,并每隔X秒对此列进行“轮询”。我认为它可以工作,但它似乎是可怕的解决方案,我想知道什么是解决这个(我假设是常见的)问题的标准方法 更新: 只是为了增加更多的内容。我的问题不是那么笼统。我只有更新表的代码的一个特定部分,更

我在页面中有一个表格,显示摘要数据。
这些数据来自汇总数据库表。如果基础表得到更新,我需要刷新页面中显示的此表。
我知道的方法是每X秒重新加载一次页面。
但我感兴趣的是在表实际更新时更新表。
这方面的标准解决方案是什么?我所能想到的唯一方法是向表中添加一些额外的列,以更新行ID,并每隔X秒对此列进行“轮询”。我认为它可以工作,但它似乎是可怕的解决方案,我想知道什么是解决这个(我假设是常见的)问题的标准方法

更新:

只是为了增加更多的内容。我的问题不是那么笼统。我只有更新表的代码的一个特定部分,更新完全在我的控制之下。它不像一个由多个源更新的表,有很多不同的方法来解决这样的问题。最好和最有效的解决方案将涉及服务器的一些帮助,以了解何时/发生了什么变化。以下是一些想法:

  • 使用与服务器的websocket连接,以便服务器可以在后端数据发生更改时发出通知,然后客户端可以请求新数据

  • 在原始页面中传递某种类型的“最后一个事务id”,然后在轮询间隔内使用ajax调用询问服务器自上次事务id以来数据是否发生了更改。如果是,请请求新数据。如果没有,那就没什么可做的了。这可以防止您在没有任何实际更改的情况下反复获取数据

  • websocket的替代方案是http推送的长轮询,也可以使用http推送(特别是在不支持websocket的客户端中)来允许服务器在出现新数据时通知客户端


  • 这是WebSocket(用于垫片)的前提。您需要(如前所述)一个服务器(如Node.JS)来支持WebSocket功能——大多数现代web浏览器都在客户端支持此API

    Web Sockets API()允许浏览器与服务器连续通信数据(反之亦然)

    如果更新了数据库记录,则可以设置触发器将此数据传回客户端。以评论板系统(与我们在StackOverflow上使用的系统完全相同)为例——因为web上已经有大量信息可用,我认为没有必要在这里详细介绍

    进一步阅读和工具:

    正如其他人提到的,您可以使用AJAX通过setInterval(首选)或setTimeout方法进行轮询。不要忘记创建一个变量来存储集合[Fn]的ID,以防您(或用户)希望取消它:

    var pollID = window.setInterval(function poller(){ getAjaxData(); }, 2000);
    if (noUpdate) window.clearInterval(pollID);
    
    通信系统 你有多种方法可以创建一种自动更新的动态页面(如Facebook)

  • Basic.最基本的方法是,如您所说,每X秒轮询一次服务器(有一个JavaScript无限$.ajax({});循环,每X秒调用一次),以查看服务器上是否有新内容。这是一个有效的解决方案,过去也曾使用过

  • 推送。第二种方法是推送。如果您在后端使用异步框架(即Node.js、Tornado、Twisted等),您可以非常轻松地使用此解决方案,因为它几乎没有性能成本。对于其他后端框架,如PHP或Django,这并不是一个好方法,因为您为每个请求创建一个进程,该进程将一直保持打开状态,直到更新某些内容或达到Http连接的超时(据我所见,人们将大部分时间放在长轮询上的30秒计时器)

  • 套接字。这是最新且最不受支持的方法。并非所有浏览器都可以访问WebSocket。与以前一样,异步框架更适合这种方法

  • 如果您有一个基于CGI的back-en框架(这意味着WCGI、FastCGI等),比如Django、PHP、Flask等,那么您最好采用第一种方法,这是最基本的方法。对于您的服务器来说,采取任何其他措施都是非常昂贵的。如果您有一个异步后端,那么第二种或第三种方法都可以。 我必须说,WebSockets方法更难进入、正确编程和支持框架

    数据库系统 选择要用作通信系统的内容后,数据库设计需要反映需要执行的新查询类型。
    假设用户希望看到加载页面后的所有新更改

    • 一个简单的方法是在每一行上都有一个日期,这是最后一次更改的时间。查询自上次查询以来更改的所有行

    • 更复杂的方法是实现一个完整的通知系统。对于每个更改或新行,将添加一个关于它的新通知。您可以在用户和通知之间建立关系,以了解他是否已经看到它,并安排每24小时一次作业来删除旧关系。但很快这一切都变得浮肿起来。我更喜欢在通知系统中使用NoSQL数据库(类似CouchDB的JSON数据库)。您可以轻松更改文档的结构,并为所有通知创建特定视图。它比关系数据库更容易使用。如果您想知道在用户加载页面后数据是否发生了更改,则只需查询通知类型(您正在观察哪些数据/表发生了更改),并获取创建日期比上次查询的时间新且未查看的数据/表。由于表始终反映最后一种状态,因此在页面加载时查询表,然后仅
      (function poll() {
        $.ajax('/myTableData', {
          success: function(data) {
              updateTable(data);
          },
          complete: function() {
             setTimeout(poll, 8000); //every eight seconds
          }
        });
      })();