You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Converse.js中无需刷新页面实时获取聊天室在线成员

解决Converse.js实时获取聊天室用户的问题

问题分析

你当前代码监听的getToolbarButtons事件,只会在工具栏按钮加载或更新时触发,没法响应新用户加入的实时变化。要实现不用刷新就能获取用户,得监听Converse.js提供的成员变更相关事件,同时结合初始成员加载的事件覆盖所有场景。

解决方案代码

export const moderationActions = () => {
  window.converse.plugins.add('moderation-actions', {
    dependencies: [],
    initialize: function () {
      const _converse = this._converse;

      // 抽通用的用户日志函数,避免重复写代码
      const logOccupants = (occupants) => {
        occupants.forEach(occupant => {
          console.log(occupant.get('nick'), occupant.get('show'));
          console.log(occupant);
        });
      };

      // 首次加载成员列表时触发,获取初始所有用户
      _converse.api.listen.on('membersFetched', (room) => {
        console.log('初始成员列表:');
        logOccupants(room.occupants.models);
      });

      // 新用户加入时实时触发
      _converse.api.listen.on('occupantJoined', (occupant) => {
        console.log('新用户加入:');
        console.log(occupant.get('nick'), occupant.get('show'));
        console.log(occupant);
        // 如果要打印当前全部用户,可调用logOccupants(occupant.room.occupants.models)
      });

      // 可选:监听用户离开事件
      _converse.api.listen.on('occupantLeft', (occupant) => {
        console.log('用户离开:');
        console.log(occupant.get('nick'));
      });
    },
  });
};

代码说明

  • membersFetched:聊天室成员列表首次加载完成时触发,用来获取初始的所有用户。
  • occupantJoined:每次有新用户加入时触发,实时拿到新用户信息,不用刷新页面。
  • occupantLeft:可选监听,用来处理用户离开的场景。
  • 提取logOccupants通用函数,既避免重复代码,也方便后续扩展(比如更新页面上的用户列表显示)。

额外提示

如果需要点击工具栏按钮时查看当前用户,你可以保留原来的getToolbarButtons事件监听,但结合上面的事件保证用户列表实时性,或者直接在按钮点击逻辑里获取当前房间的occupants模型即可。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:09:33