【问题标题】:Why when i submit a form for chat app the output comes multiplied by the amount of times i submitted为什么当我为聊天应用程序提交表单时,输出乘以我提交的次数
【发布时间】:2015-08-03 09:29:37
【问题描述】:

第一次输入后点击提交,出现一个li,很好。但是当我第二次单击它时,输出被打印了 2 次和 3 次,它被打印了 3 次,依此类推。为什么?我只希望它每次点击打印一次。

客户:

var socket = io()
    var name;
    var msg;
    $("#nameForm").on("submit", function(e){
        var name = $(".nameInput").val()
        socket.emit("heres name", name);
        socket.on("outputName", function(data){
            name = data;
            $(".messages").append("<li>" + name +"</li>")
            // $("#nameForm").fadeOut()
        })
        e.preventDefault();
    })

html:

<div class="chatArea">
    <ul class="messages"></ul>
</div>
<form id = "nameForm">
    <input type="text" class="nameInput"><button>Enter Name</button>
</form>
<form id = "msgForm">
    <input class="msgInput" type= "text"></input><button>Enter message</button>
</form>
<script src ="http://code.jquery.com/jquery-2.1.1.js"></script>
<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>

index.js:

var express = require("express")
var app = express();
var server = require("http").createServer(app);
var io = require("socket.io")(server);

var port = process.env.PORT || 8080;

server.listen(port, function(){
    console.log("server is listening on port %d", port)
})

app.use(express.static(__dirname + "/public"));

var usernames = {};
var numUsers = 0;
var msg;

io.on("connection", function(socket){
    var addedUser = false;

socket.on("heres name", function(username){
    ++numUsers;
    addedUser = true
    usernames.username = username
    socket.emit("outputName", usernames.username)
})



})

【问题讨论】:

    标签: javascript jquery socket.io chat


    【解决方案1】:

    您必须在点击时阻止提交按钮并等待响应并在响应时解锁该按钮。

    var socket = io()
    var name;
    var msg;
    $("#nameForm").on("submit", function(e){
        $("#nameForm input[type='submit']").disable();
        var name = $(".nameInput").val()
        socket.emit("heres name", name);
        socket.on("outputName", function(data){
            name = data;
            $(".messages").append("<li>" + name +"</li>");
            $("#nameForm input[type='submit']").enable();
            // $("#nameForm").fadeOut()
        })
        e.preventDefault();
    })
    

    别忘了在行尾加分号!

    更新:

    var socket = io();
    var name;
    var msg;
    socket.on("outputName", function(data){
        name = data;
        $(".messages").append("<li>" + name +"</li>");
        $("#nameForm input[type='submit']").enable();
    })
    $("#nameForm").on("submit", function(e){
        $("#nameForm input[type='submit']").disable();
        var name = $(".nameInput").val();
        socket.emit("heres name", name);
        e.preventDefault();
    })
    

    【讨论】:

    • 感谢您的回答和关于分号的提醒。你能告诉我为什么它会像现在这样输出吗?为什么它的打印次数似乎取决于表单提交的次数。我知道你说我必须阻止提交按钮。为什么会这样?我以为我用错了socketio,我不习惯forms。
    • 啊,我现在明白你的问题是什么了。每次提交表单时,您都在注册事件处理程序 socket.on("heres name", ...。只需将您的 socket.on 移到“提交”回调之外
    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多