我制作了一个简单的游戏平台。它是一个单页的应用程序。顶级元素是index.html,不同的视图被加载到它的div" app-view"使用下划线和require.js。网页通过socket.io与服务器通信,socket.io是在第一页加载期间在顶层创建的。这是我的main.js和nameSelection.js:
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,则不会将消息发送到服务器。