Day07:Boardcast Event(推播事件)

全文同步於个人 Docusaurus Blog

当某个使用者输入讯息发送到 server 後,若当前环境为留言板或公共频道,server 端则必须推播讯息给该名使用者以外的所有人。虽然听起来好像不好处理,但其实只要利用 socket 建立连线後永久传输的特性,server 端透过 emit() 向 client 推播转发,client 则保持用 on() 监听变化。

// server.js
io.on('connection', (socket) => {
  console.log(`Server:${socket.id}`);

  socket.on('group-chat-message', (data) => {
    console.log(data);
    io.emit('group-chat-message', data);
  });
});
// handler.js
const connectSocketIoServer = () => {
  socket = io('/');

  // ...

  socket.on('group-chat-message', (data) => {
    console.log(data)
  })
};

由於此前使用 group-chat-message 这一组 socket 传送讯息给 server,所以自然就是监听这组。

Render Message

无论是送出讯息的一方,或是接收讯息者,这些讯息都应该被呈现在页面上,让目前处於这个频道的人可以看见。

需要渲染即时的讯息内容,同样透过操作 DOM 来塞入 HTML,这边补上一个之前漏掉的 function。

// element.js
const getChatMessageContent = (data) => {
  const { author, messageText } = data;
  const messageContent = document.createElement('div');
  messageContent.classList.add('message-content');
  messageContent.innerHTML = `
    <p class="message-paragraph">
      <span class="message-author">${author}:</span>${messageText}
    </p>
  `;

  return messageContent;
};

export default {
  getChatList,
  getChatMessageContent,
};

上面这组 function 用来生成,输入讯息者以及他所输入的内容。

接着,需要将这段 HTML 同样透过 append 的方式塞到对话框的讯息列表中。

// ui.js
const appendChatMessage = (data) => {
  const groupChatMessage = document.getElementById(messageContainerID);
  const chatMessageContent = element.getChatMessageContent(data);
  groupChatMessage.appendChild(chatMessageContent);
};

export default {
  goToChat,
  appendChatMessage,
};

导出的 appendChatMessage() 只是生成静态的 HTML,仍需要传入资料来显示动态内容,所以将其拉到 handler.js 导入:

// handler.js
import ui from '../ui.js';

const connectSocketIoServer = () => {
  socket = io('/');

  // ...

  socket.on('group-chat-message', (data) => {
    console.log(data);
    ui.appendChatMessage(data);
  });
};

现在可以打开数个 browser 来测试,当不同使用者分别输入讯息时,是否能达到多人对话的效果。

group chat


<<:  [Day8]Where子句实作

>>:  DAY11-JavaScript(一)

Vue 如何在 LocalHost 开发环境时使用 HTTPS

如果你有 Localhost 开发环境需要以 HTTPS 浏览时,可以参考以下方法: 方法一:vue...

Day 29. Hi-Fi Prototype-以 Figma 制作高精度原型 (下)

由於 Figma 的核心是 GUI 设计工具,附带原型制作能力,所以一般来说我们都会使用它来进行高精...

Sass 连接词(&)基础介绍 DAY32

在介绍今天的内容之前 推荐一个不错的东西 那就是 CodePen啦 https://codepen....

egg(nodejs) 执行 shell script 动态增加 nginx server_name

有时候反向代理的域名 会需要新增 透过 api server接收後 执行sh 动态来为 nginx ...

大共享时代系列_022_Twitch Plays (衆人同时用弹幕控制一个游戏角色)

同心协力操作一个游戏角色,怎麽那麽难?ヽ(≧Д≦)ノ 你都怎麽玩电玩呢? 独自玩闯关、模拟类游戏? ...