Проблема с WebSocket

У меня есть функция отправки сообщения через WebSocket, но возникает проблема: при нажатии на кнопку отправки страница перезагружается. Вот мой код:

javascript

sendButton.onclick = function(event) {
    event.preventDefault(); // Предотвращаем действие по умолчанию
    event.stopPropagation(); // Остановит дальнейшую обработку события
    console.log('Кнопка нажата'); // Проверка
    const message = messageInput.value.trim();

    if (message) {
        const data = {
            command: "sendMessage",
            user_id: userId,
            receiver: receiverId,
            text: message
        };

        socket.send(JSON.stringify(data));
        messageInput.value = ''; // Очищаем поле ввода после отправки
    }
};

HTML:

html

<div class="input-area">
    <input type="text" id="messageInput" placeholder="Введите сообщение...">
    <button class="send-button" id="sendButton" type="button">Отправить</button>
</div>

Серверная часть:

python

elif data["command"] == "sendMessage":
    sender = data["user_id"]
    receiver = data["receiver"]
    text = data["text"]
    await send_message_with_chat_creation(sender, receiver, text)
    cursor.execute("INSERT INTO messages (sender, receiver, text) VALUES (?, ?, ?)", (sender, receiver, text))
    conn.commit()

    await websocket.send_text(json.dumps({
        "status": "success",
        "command": "messageSent",
        "message": text
    }))

Несмотря на использование event.preventDefault(), при выполнении строки socket.send(JSON.stringify(data)); происходит перезагрузка страницы. Как это можно исправить?


Ответы (1 шт):

Автор решения: Владлен Вожжаев

Проблема в том, что вы не прерываете отправку, а прерываете событие клика, которого по сути то и нет. onclick это не то же самое, что onsubmit.

Хотя в вашем коде я не вижу вообще form, и по идее браузер не должен вообще перезагружать страницу, но могу предположить, что вы просто не совсем точно приложили HTML код и там всё-таки есть форма которую браузер отправляет и надо гасить событие submit.

Можете попробовать так, Обработчик на событие submit формы: Если ваша кнопка находится в форме, вам следует предотвратить действие по умолчанию не только для кнопки, но и для всей формы:

const form = document.querySelector('.input-area'); // тут по идее селектор формы     
  form.onsubmit = function(event) {
  event.preventDefault(); // Предотвращаем отправку формы
};

Ну и послушаем клик

sendButton.addEventListener('click', function(event) {
event.preventDefault();
console.log('Кнопка нажата');
const message = messageInput.value.trim();

if (message) {
    const data = {
        command: "sendMessage",
        user_id: userId,
        receiver: receiverId,
        text: message
    };

    socket.send(JSON.stringify(data));
    messageInput.value = '';
}
});
→ Ссылка