Javascript Socket.io发出不';不发送
我正在做一个简单的游戏平台。这是一个单页的应用程序。顶层元素是index.html,使用下划线和require.js将不同的视图加载到其div“app view”中。网页通过socket.io与服务器通信,socket.io在第一次页面加载期间在顶层创建。以下是我的main.js和nameSelection.js:Javascript Socket.io发出不';不发送,javascript,socket.io,requirejs,Javascript,Socket.io,Requirejs,我正在做一个简单的游戏平台。这是一个单页的应用程序。顶层元素是index.html,使用下划线和require.js将不同的视图加载到其div“app view”中。网页通过socket.io与服务器通信,socket.io在第一次页面加载期间在顶层创建。以下是我的main.js和nameSelection.js: define(function (require) { return { render : function (socket, changeView) {
define(function (require) {
return {
render : function (socket, changeView) {
$('#setNameButton').click(function(){
console.log("set username");
var username = document.getElementById("username").value;
console.log(username);
var obj = {};
obj.name = username;
console.log(obj);
socket.emit('setPlayerName', obj);
});
}
}
});
main.js:
define(function (require) {
console.log("app loaded");
var _ = require('underscore');
var $ = require('jquery');
var nameSelection = require('./nameSelection');
var socket = io();
var changeView = function(name, callback, options, container) {
console.log('changeView()');
if (container === undefined) {
console.log("container undefined");
container = '#app-view';
}
if (options === undefined) {
console.log("options undefined");
options = {};
}
var path = 'text!./templates/' + name + '.ejs';
var view = require([path], function(template) {
view = template;
var tpl = _.template( view );
$(container).html( tpl (options) );
callback();
});
}
changeView('nameSelection', function() {
nameSelection.render(socket, changeView);
});
socket.on('connectionSuccessful', function(data) {
var div = document.getElementById('nameError');
div.innerHTML = "id: " + data.id;
});
});
nameSelection.js:
define(function (require) {
return {
render : function (socket, changeView) {
$('#setNameButton').click(function(){
console.log("set username");
var username = document.getElementById("username").value;
console.log(username);
var obj = {};
obj.name = username;
console.log(obj);
socket.emit('setPlayerName', obj);
});
}
}
});
问题是按钮单击处理程序中的socket.emit调用不向服务器发送数据。如果我在处理程序外部进行类似的调用,它会工作(当然是在页面加载时)。所有日志消息都已正确打印。此外,有时连接会丢失并自行重新连接,之后socket.emit调用有时会工作。我完全糊涂了,如果能帮上忙,我将不胜感激
编辑:当我按以下顺序操作时,它工作正常:
但是,如果我在不执行步骤1-4的情况下重新启动服务器并执行步骤5,则消息不会发送到服务器 我没有使用socket.io,但在其他使用基于websocket的通信的情况下,我需要在连接丢失时重新启动客户端。是否有自动重新连接选项?您能否捕获连接丢失的事件并自己重新启动它?