目前尝试与CakePHP 3和节点js创建基本聊天,实际上两个用户之间的消息显示效果非常好
但问题是:
我发送一条消息,控制器被调用并发回一个答案,但是如果我发送另一条消息,控制器会被调用两次,然后是三次,依此类推,我需要重新加载页面以避免这种行为。
但是对于控制器的调用,消息不会以双倍或三倍的形式显示。
我该如何避免这种行为?
这是我的服务器
var server = require('http').createServer(server),
io = require('socket.io').listen(server),
fs = require('fs');
moment = require('moment'); // librairie js pour la manipulation de date
moment.locale('fr'); // date en français
var date_format = moment(); // date actuelle
var date_comm = date_format.format('LL'); // mise en forme
// connexion / déconnexion
io.sockets.on('connection', function (socket) {
// renvoi du commentaire
socket.on('comm', function (data) {
socket.broadcast.emit('commentaire', {
auteurcomm: data.auteurcomm,
comm: data.comm,
avatar: data.avatar,
date_comm: date_comm
}); // renvoi aux autres et pas à moi
});
});
server.listen(8083);
我的客户
var socket = io.connect('http://localhost:8083'); //create connection
$('#form_comm').submit(function(e){
e.preventDefault();
$.ajax({
type: 'POST',
url: '/instatux/commentaire/add',
dataType: 'json',
data: $('#form_comm').serialize(),
error: function(data)
{
alert('fail');
}
});
return false;
});
$('#form_comm').submit(function () {
var comm = $('#comm').val();
var avatar = $('#avatar').val(); // champs caché contenant l'avatar
var auteurcomm = $('#auteurcomm').val(); // champs caché contenant l'avatar
avatar = '/instatux/img/' + avatar;
var avatarcomm = avatar.replace("/post", "");
moment.locale('fr'); // date en français
var date_format = moment(); // date actuelle
var date_msg = date_format.format('LL'); // mise en forme
socket.emit('comm', {comm: comm, avatar: avatarcomm, auteurcomm: auteurcomm}); // Transmet le message aux autres
$('#list_comm').prepend('<div class="comm"><img src="' + avatarcomm + '"alt="image utilisateur" class="img-thumbail left avatarcomm"/><a href="/instatux/' + auteurcomm +'" class="link_username_tweet">' + auteurcomm + '</a><span class="alias_tweet">@' + auteurcomm +'</span> - <span class="date_message">' + date_msg + '</span><p></p><p>' + comm +'</p></div>');
$('#comm').val('');
});
// retour du server
socket.on('commentaire', function(data) {
$('#list_comm').prepend('<div class="comm"><img src="' + data.avatar + '"alt="image utilisateur" class="img-thumbail left avatarcomm"/><a href="/instatux/' + data.auteurcomm +'" class="link_username_tweet">' + data.auteurcomm + '</a><span class="alias_tweet">@' + data.auteurcomm +'</span> - <span class="date_message">' + data.date_comm + '</span><p></p><p>' + data.comm +'</p></div>');
});
// appuie sur la touche entrée
$("#comm").keypress(function(e) {
if (e.which == 13) {
$('#form_comm').submit();
}
});