【问题标题】:How can I make an AJAX refresh like Gmail's inbox?如何像 Gmail 的收件箱一样进行 AJAX 刷新?
【发布时间】:2011-10-24 21:53:44
【问题描述】:

我正在制作一个消息传递系统,我目前正在使用 jQuery 的 .load() 每 10 秒重新加载一次保存消息的 div 的内容,但我有一个问题:当尝试制作“全选”按钮时,“删除选定的“按钮等。当 10 秒到来时,它会重新加载按钮并重新加载消息,因此由于重新加载,消息会被取消选择。

我想知道的是如何让它真正加载到新消息中,而不是真正重新加载整个 div。我知道 Gmail 不会重新加载整个 div,因为它可以正常工作。

这是我的 JavaScript 函数,它重新加载 div 并更改页面标题(具有收件箱计数)以使其保持更新:

function title() {
setTimeout("document.title = $('#heading').text();", 500);
}
function ajaxStuff() {
setTimeout("$('#heading').load('/employee/message/inbox.php #h1_head'); $('#messages').load('/employee/message/inbox.php #messages_inner');title();ajaxStuff();", 10000);
}
ajaxStuff();

这是我设置收件箱的方式:

基本上我想做的是使用 AJAX 加载新消息,但不知何故不刷新 div。我尝试查看 Gmail 的源代码,但要查看的内容太多,而且它们会与一堆随机的类和 ID 混淆。

注意:我已经在 Google 上搜索了一段时间,但没有找到任何东西。

【问题讨论】:

  • 而不是重新加载整个 div,只需将新消息附加或添加(取决于您希望它在顶部还是底部)仅到 div。这将需要使用 $.ajax 而不是 $().load
  • @KevinB 好主意,但是怎么做呢?有没有例子或教程?谢谢。
  • checking 用于新消息时,在您的请求中发送最新消息的 ID。然后,您的 php 将仅返回您添加到现有数据中的所有新内容。
  • @Radek 是的,这是个好主意。所以当我通过 ajax 请求发送它时,我想知道我会怎么做。还要记住,它是一个供所有用户使用的表(然后是数据库中的 from_userto_user 列),然后我在 MySQL 查询中使用 WHERE 关键字来仅显示该用户的消息。那么这样还能正常工作吗?
  • 让我们在我的回答下进行讨论。我希望它对你有用。

标签: javascript jquery ajax


【解决方案1】:

回应cmets:

我认为这里没有必要提供教程。更改您的服务器代码以返回带有class="new" 属性的“新”消息,然后使用:

$.ajax({
  url: "/employee/message/inbox.php",
  success: function(result) {
    $(result).find(".new").prependTo("#heading");
  }
});

当然,该代码可能需要一些修改以适应您的环境/返回数据。

【讨论】:

  • 哇,谢谢!但是我的 PHP 代码只是从数据库中放入所有消息(给登录的用户),我真的没有任何东西可以识别“新”电子邮件并为其添加一个类。我会知道如何添加一个类,但是有什么技术可以查看哪个是新的吗?也许我应该在 MySQL 表中添加一列并检查它是否具有“新”值或其他东西......?如果您需要,我可以编辑我的原始问题并添加一些额外的细节(例如 PHP 代码)。
  • 如何将其称为“已打开”而不是“新建”。当您单击消息的链接并打开它时,它会在获取数据时将该位切换为 false。因此,当您刷新主收件箱并填充邮件时,它就会知道哪些已被阅读/打开。
  • @Nathan 我不知道。那是我无法为你弄清楚的事情。也许,检查当前显示的最新消息的 id,并将该 id 传递回服务器。然后,只需返回该 ID 之后的那些。
  • @KevinB 是的,这是个好主意。由于所有消息 ID 都是有序的,因此它应该可以与 if 语句和一些 mysql 查询一起使用。
  • @cgatian 我已经有一些内容可以说明何时阅读或不阅读。我可能会照凯文所说的去做。但是谢谢:)
【解决方案2】:

在检查新消息时,请在您的请求中发送最新消息的 ID。然后,您的 php 将仅返回您添加到现有数据中的所有新内容。

    jQuery.ajax({
        type: 'get',
        dataType: 'text',
        url: "/employee/message/inbox.php",
        data: {
            from_user : from_user, 
            to_user: to_user, 
            message_id: message_id,  
            something_else_you_need_to_send: its_value 
            t: Math.random() 
        },
        success: function(data, textStatus){
                      // whatever you need to do with the result returned from php (server)                    
        }

然后在你的 sql 查询中你做

select * from table 
  where user_id=user_id_from_ajax 
    and message_id > message_id_from_ajax`

更新

在你的 php 中使用

    $from_user = $_REQUEST['from_user'];
    $to_user = $_REQUEST['to_user'];
    $message_id = $_REQUEST['message_id'];

【讨论】:

  • 谢谢...这是一个新查询还是我必须用它替换我当前的查询?或者这会在另一个检查新消息的页面中吗?非常感谢您的帮助:)
  • 如果不查看所有代码,这有点难以判断。我的理解是,您在由 php(比如说 index.php)创建的页面上有这个收件箱表,然后 ajax 调用会刷新表。您可以调用相同或不同的php。最好有另一个文件,比如 tools.php,其中包含从 ajax 调用的所有代码。根据您的 ajax 参数,您可以调用 tools.php 的不同部分。我通常在我的 ajax 参数中有一个叫做mode。 php中有一个基于mode的条件需要做什么。
  • 您现在可以做的是使用另一个带有全新 javascript + ajax 调用的按钮和带有新 sql 的新 php 代码来刷新收件箱。一旦一切正常,您only 删除旧代码。我认为您需要修改当前的 html 以将 user_id 和消息 id 存储在某处。
  • 我已经将用户 ID 存储在会话变量中。所以,也许我可以向页面上显示的第一封电子邮件添加一个类(使用 jQuery),然后使用该类获取该元素的 ID(因为我向消息 [div] 添加了一个 ID,以便我可以识别它们)也许我将制作另一个页面(用户显然不会看到这个页面,它只会有查询和内容)专门用于检查新消息。我现在要睡觉了,所以我明天继续。再次感谢。
  • 我想我已经知道我现在要做什么了。我将创建一个名为“check_new.php”的页面,然后它将包含 MySQL 查询和所有其他内容。然后我可以使用 ajax 从那里获取最新消息。如果一切正常,我会告诉你的。
猜你喜欢
  • 2010-10-11
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 2021-10-15
相关资源
最近更新 更多