You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Bootstrap导航栏消息通知徽章实现求助:AJAX获取未读消息数

嘿,我来帮你搞定这个未读消息徽章的实现!其实思路很清晰:后端提供接口返回未读数量,前端用AJAX定时拉取数据,然后更新导航栏里的徽章元素就行。下面一步步来:

1. 先搞定后端接口

你需要写一个接口,用来返回当前登录用户的未读消息总数。这个接口要做两件事:验证用户身份(比如通过session或者token),然后从数据库里统计未读消息的数量。举个PHP的例子:

// get-unread-count.php
session_start();

// 确保用户已登录,这里根据你的鉴权方式调整
if (!isset($_SESSION['user_id'])) {
  header('HTTP/1.1 401 Unauthorized');
  echo json_encode(['count' => 0]);
  exit;
}

// 替换成你的数据库查询逻辑
$userId = $_SESSION['user_id'];
// 假设用PDO查询
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'pass');
$stmt = $pdo->prepare('SELECT COUNT(*) FROM messages WHERE receiver_id = ? AND is_read = 0');
$stmt->execute([$userId]);
$unreadCount = $stmt->fetchColumn();

header('Content-Type: application/json');
echo json_encode(['count' => $unreadCount]);

如果是Node.js/Express的话,逻辑类似,核心就是返回一个JSON格式的count字段。

2. 前端AJAX拉取并更新徽章

接下来在前端写代码,定时请求这个接口,然后更新导航栏里的徽章。这里给你两种方案,选你顺手的:

方案一:用jQuery(如果你项目里已经引入了)

// 封装成函数,方便调用
function refreshUnreadBadge() {
  $.ajax({
    url: '/get-unread-count.php', // 你的接口地址
    method: 'GET',
    dataType: 'json',
    success: function(res) {
      const badge = $('.badge.badge-pill.badge-primary');
      if (res.count > 0) {
        badge.text(res.count).show(); // 有未读就显示数量
      } else {
        badge.hide(); // 没未读就隐藏徽章,或者也可以显示0,看你需求
      }
    },
    error: function() {
      console.log('获取未读消息数失败,稍后重试');
    }
  });
}

// 页面加载完成后先执行一次
$(document).ready(function() {
  refreshUnreadBadge();
  // 每隔30秒自动刷新一次,时间可以自己调,别太频繁就行
  setInterval(refreshUnreadBadge, 30000);
});

方案二:原生JavaScript(不用jQuery)

function refreshUnreadBadge() {
  fetch('/get-unread-count.php')
    .then(response => {
      if (!response.ok) throw new Error('请求失败');
      return response.json();
    })
    .then(data => {
      const badge = document.querySelector('.badge.badge-pill.badge-primary');
      if (data.count > 0) {
        badge.textContent = data.count;
        badge.style.display = 'inline-block';
      } else {
        badge.style.display = 'none';
      }
    })
    .catch(err => console.log(err.message));
}

// 页面加载后初始化
document.addEventListener('DOMContentLoaded', () => {
  refreshUnreadBadge();
  // 定时刷新
  setInterval(refreshUnreadBadge, 30000);
});

3. 导航栏结构注意点

确保你的导航栏里已经有了那个徽章元素的位置,比如:

<nav class="navbar navbar-expand-lg">
  <ul class="navbar-nav">
    <li class="nav-item">
      <a class="nav-link" href="/messages">
        消息中心
        <!-- 就是这个徽章,初始可以设为0或者隐藏 -->
        <span class="badge badge-pill badge-primary" style="display: none;">0</span>
      </a>
    </li>
    <!-- 其他导航项 -->
  </ul>
</nav>

一些额外的小建议

  • 鉴权要做好:后端接口一定要验证用户身份,不能让随便一个请求都能拿到别人的未读消息数。
  • 调整刷新间隔:30秒是个比较合理的默认值,如果你需要更实时,可以改成10秒,但别太频繁给服务器加压力。
  • 消息已读处理:当用户进入消息页面后,可以暂停定时刷新,或者刷新后把徽章隐藏,避免重复提示。
  • 错误处理:AJAX请求失败时,最好不要一直弹提示,简单在控制台打个日志就行,或者做个静默重试。

内容的提问来源于stack exchange,提问作者Mike Davidson

火山引擎 最新活动