socketio работает только при использовании window.alert в функции - PullRequest
2 голосов
/ 05 мая 2020

Я столкнулся с очень странной проблемой. Я захожу в Webdev, используя flask и vanilla javascript. Сейчас пытаюсь написать простой чат с помощью socketio. Кажется, работает только тогда, когда я использую window.alert в функции. Если я удалю его, сайт просто перезагрузится. Нет вывода в терминале и нет добавленного элемента в списке. как только ставлю обратно все работает нормально! Если я это сделаю, сообщение появится в списке, и в терминале я смогу увидеть распечатку приложения flask.

python / flask

import os
import requests

from flask import Flask, jsonify, render_template, request
from flask_socketio import SocketIO, emit

app = Flask(__name__)
app.config["SECRET_KEY"] = os.getenv("SECRET_KEY")
socketio = SocketIO(app)

@app.route("/", methods=['GET', 'POST'])
def index():
    return render_template("index.html")


@socketio.on("submit")
def submit(text):
    print("SUBMIT:", text['text'])
    text = text['text']
    emit("announce text", {'text': text}, broadcast=True)

Javascript

document.addEventListener('DOMContentLoaded', () => {

      // Connect to websocket
      var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port);

      // When connected, configure buttons
      socket.on('connect', () => {
          console.log("connected");

          document.querySelector('#form').onsubmit = () => {
              var text = document.querySelector('#text').value;
              // window.alert(text)
              socket.emit('submit', {'text': text});
              window.alert(text); // <-- This line makes it work and not work!
          };
      });

      socket.on('announce text', data => {
          // window.alert(data)
          var li = document.createElement('li');
          li.innerHTML = `${data.text}`;
          //window.alert(li);
          document.querySelector('#messages').append(li);
      });

HTML чтобы все было

<html>
      <head>
          <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
          <script src="/static/index.js"></script>
          <title>Vote</title>
      </head>
      <body>
          <ul id="messages">
          </ul>
          <hr>
          <form class="" id="form" action="" method="post">
              <input id="text" type="text" name="" value="">
              <input id="submit" type="submit" name="" value="Send">
          </form>
      </body>
  </html>

1 Ответ

1 голос
/ 06 мая 2020

Вам нужно preventDefault событие submit, потому что форма выполняется с поведением по умолчанию - поэтому он делает запрос POST для фактического маршрута (потому что атрибут action пуст) - вот почему страница перезагружается - и с preventDefault() вы можете запретить форме делать это, точно так же

document.querySelector('#form').onsubmit = (e) => {
  e.preventDefault();
  var text = document.querySelector('#text').value;
  socket.emit('submit', {'text': text});
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...