显示 AJAX 的通知
Showing notification with 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 中。所以我写了 $_SESSION['data']
.
而不是 $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>
我进行此更改是因为我考虑到这样一个事实,即根据定义,会话是在域内全局创建和访问的。所以一旦设置好,就可以在所有其他页面上检查和使用。
因此,只有当 SESSION 未设置时,才应显示默认状态。但这似乎也没有达到我想要的结果。仍然发生同样的事情。
好的,现在回答我自己的问题。 :)
我的 UPDATE 似乎是我尝试过的好主意。
问题是我在主 PHP 文件上写了 session_start();
,该文件包含在项目的所有其他 PHP 文件中。
所以我基本认为调用ajax.php文件的时候,不用再写session_start();
了。因为 ajax.php 是在 PHP 文件中调用的,该文件中已经有 session_start();
。所以,我错了!
在 ajax.php 中的代码开头添加 session_start();
简单地解决了这个问题。
我的用户面板上有一个导航栏。导航栏的一部分指示用户是否有新的未读消息。在这种情况下,图标旁边会出现一个徽章。我在这里简化了代码,使它们更容易理解和阅读。
所以这是简化的 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 中。所以我写了 $_SESSION['data']
.
$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>
我进行此更改是因为我考虑到这样一个事实,即根据定义,会话是在域内全局创建和访问的。所以一旦设置好,就可以在所有其他页面上检查和使用。 因此,只有当 SESSION 未设置时,才应显示默认状态。但这似乎也没有达到我想要的结果。仍然发生同样的事情。
好的,现在回答我自己的问题。 :)
我的 UPDATE 似乎是我尝试过的好主意。
问题是我在主 PHP 文件上写了 session_start();
,该文件包含在项目的所有其他 PHP 文件中。
所以我基本认为调用ajax.php文件的时候,不用再写session_start();
了。因为 ajax.php 是在 PHP 文件中调用的,该文件中已经有 session_start();
。所以,我错了!
在 ajax.php 中的代码开头添加 session_start();
简单地解决了这个问题。