首页 > 解决方案 > 使用 AJAX 显示通知

问题描述

我的用户面板上有一个导航栏。导航栏的一部分指示用户是否有新的未读消息。在这种情况下,图标旁边会出现一个徽章。我已经简化了这里的代码,使它们更容易理解和阅读。

这是简化的 HTML 代码:

<div class="btn-group msg-box">
   <i class="fa fa-envelope"></i>
   // this is the default state, no badge is shown
</div>

这是每 10 秒调用一次自定义函数的 AJAX 请求:

<script type='text/javascript'>
    $(document).ready(function(){
        setInterval(checkMsg,10000);
    });

    function checkMsg(){
        $.get('ajax.php',{user_id : <?php echo $user_id; ?>},function(data){
            $('.msg-box').html(data);
        });
    }
</script>

这是 ajax.php 文件内容:

if(isset($_GET['user_id']){
   // a few lines of code here to check if that particular user has any unread message.
   // In such case a variable name $newMessage is set to 1. Now ... :
   if($newMessage>0){
      $data='
         <i class="fa fa-envelope"></i>
         <span class="badge"><i class="fa fa-info"></i></span>
      ';
   }else{
      $data='
         <i class="fa fa-envelope"></i>
      ';
   }

   echo $data;

}

首先,我知道我编写这个 AJAX 请求的方式非常菜鸟,但无论如何它工作得很好,最多一点!

如果用户有新消息,并且他们留在页面上,则代码会完美运行并显示徽章。但是当用户刷新页面或转到另一个页面时,即使他们有一条新消息,在没有标记的地方也会再次显示默认状态。我知道这当然是因为我已经通过 HTML 代码指定了默认状态。

我需要知道如何保持 AJAX 请求的结果,而不管用户刷新页面或转到另一个页面的次数。

更新

我尝试将查询结果存储在我的 ajax.php 文件中的 SESSION 中。所以不是$data我写的$_SESSION['data']

回到我的 HTML,我做了以下更改:

<div class="btn-group msg-box">
   <?php
   if(!isset($_SESSION['data'])){
   ?>
      <i class="fa fa-envelope"></i>
   <?php
   }else{
      echo $_SESSION['data'];
   }
   ?> 
</div>

我做出这个改变是因为我考虑到根据定义,SESSIONS 是在域内全局创建和访问的。因此,一旦设置好,就可以在所有其他页面上进行检查和使用。因此,只有在未设置该 SESSION 时,才应显示默认状态。但这似乎也没有我想要的结果。仍然会发生同样的事情。

标签: ajaxnotificationsrequest

解决方案


好的,现在回答我自己的问题。:)

我的UPDATE似乎是我尝试过的一个好主意。那里的问题是我session_start();在我的主 PHP 文件上编写了该文件,该文件包含在项目的所有其他 PHP 文件中。

所以我基本上认为,调用ajax.php文件的时候,就不用再写session_start();了。因为 ajax.php 在已经包含在其中的 PHP 文件中被调用session_start();。所以,我错了!

在 ajax.php 中添加session_start();到我的代码的开头只是解决了这个问题。


推荐阅读