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

Node.js Socket.io聊天应用多人同时输入时消息输入框被清空问题求助

聊天应用输入框同步清空问题

我正在开发一款聊天应用,目前已接近完成,但遇到一个问题:当两人同时输入时,若有人按下回车键发送消息,所有人的消息输入框都会被清空。我知道问题出在哪,但不知道怎么实现只清空发送者自己的输入框。相关代码如下:

Node.js 后端代码

const express = require('express')
const socket = require('socket.io')

const app = express()
const server = app.listen(process.env.PORT || 3000, () => {
    console.log("server");
})

app.use(express.static('public'))

const io = socket(server)

io.on('connection', (socket) => {
    console.log(socket.id)

    socket.on('chat', data => {
        io.sockets.emit('chat', data)
    })

    socket.on('typing', data => {
        socket.broadcast.emit('typing', data)
    })
})

前端 JavaScript 代码

const socket = io.connect('http://localhost:3000');

const sender = document.getElementById('sender');
const message = document.getElementById('message');
const submitBtn = document.getElementById('submitBtn');
const output = document.getElementById('output');
const feedback = document.getElementById('feedback');

submitBtn.addEventListener('click', () => {
    if (sender.value != '' && message.value != '') {
        socket.emit('chat', {
            message: message.value,
            sender: sender.value,
        });
        sender.disabled = true;
    }
})

socket.on('chat', data => {
    feedback.innerHTML = ''
    output.innerHTML += '<p><strong>' + data.sender + '     : </strong>' + data.message + '</p>'
    message.value = '';
})

message.addEventListener('keypress', () => {
    socket.emit('typing', sender.value)
})

socket.on('typing', data => {
    socket.on('typing', data => {
        feedback.innerHTML = '<p>' + data + ' typing...    </p>';
        // clear feedback after one second of     inactivity
        setTimeout(() => {
            feedback.innerHTML = ''
        }, 5000);
    })
})

解决方法

问题核心在于当前代码中,所有客户端收到chat事件时都会执行message.value = '',导致不管是不是发送者,输入框都会被清空。要实现仅清空发送者的输入框,只需调整逻辑:发送消息时立刻清空自己的输入框,服务器广播的chat事件不再处理清空操作。

具体修改步骤:

  1. 在发送按钮的点击回调中,发送消息后直接清空本地输入框:
submitBtn.addEventListener('click', () => {
    if (sender.value != '' && message.value != '') {
        socket.emit('chat', {
            message: message.value,
            sender: sender.value,
        });
        message.value = ''; // 发送后立即清空自己的输入框
        sender.disabled = true;
    }
})
  1. 移除socket.on('chat')中的输入框清空代码:
socket.on('chat', data => {
    feedback.innerHTML = ''
    output.innerHTML += '<p><strong>' + data.sender + ' : </strong>' + data.message + '</p>'
    // 删除此行:message.value = '';
})
  1. 修正前端typing事件的重复绑定问题(原代码中重复监听了typing事件,会导致多次触发定时器):
socket.on('typing', data => {
    feedback.innerHTML = '<p>' + data + ' typing...</p>';
    setTimeout(() => {
        feedback.innerHTML = ''
    }, 5000);
})

修改后,只有发送消息的客户端会在点击按钮时清空自己的输入框,其他客户端收到消息时不会影响正在输入的内容,问题即可解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:50:19