2016-07-27 63 views
0

我在後端使用反應前端和節點/ express。我正在嘗試集成套接字,以便在所有其他客戶端上發出在一個客戶端上完成的任何點擊事件。 (例如,如果有人點擊「播放歌曲」,則會觸發所有其他用戶播放歌曲的點擊事件)。Socket.io和Node/Express - 超出最大調用堆棧大小

當我點擊某個東西時,它會到達服務器的套接字偵聽器,並在瀏覽器控制檯中顯示超出最大調用堆棧大小。 PS:這是我第一次導入代碼,它不會讓我縮進它!

服務器端代碼:

var express = require('express'); 
var http = require('http'); 
var app = express(); 
var server = http.createServer(app); 
var io = require('socket.io')(server); 
server.listen(8000); 
io.on('connection', function (socket) { 
    console.log('socket connected!'); 
    socket.on('myClick', function (data) { 
     console.log('event hit Server'); 
     socket.broadcast.emit('myClick', data); 
    }); 
    socket.on('disconnect', function() { 
     io.emit('user disconnected'); 
    }); 
}); 

客戶端代碼:

$(document).ready(function() { 
    var socket = io('http://localhost:8000'); 

    $(document).on('click', function(event){ 
     console.log('Something has been clicked!'); 
     console.dir(event.target); 
     socket.emit('myClick', {id: event.target}); 
    }); 
    socket.on('myClick', function (data) { 
     console.log('event hit other client'); 
     $(data.id).trigger('click'); 
    }); 
}); 
+0

使用空格:有更具體的東西,比如ID或類具有火災事件的元素的替代

$(document).on('click', function(event){ 

線縮進。 – Will

+0

沒有'console.dir'調用的錯誤? – Will

回答

1

你的錯誤是在客戶端,你是導致呼叫的無限循環:

  1. 當點擊DOM,你的「點擊」功能被激活。
  2. 該函數發出套接字的「myClick」事件,因此觸發了「myClick」函數。
  3. 在這個函數中你觸發一個點擊事件,所以,之前的函數會再次被觸發,並且你無限地回到步驟1。

解決方案

$("#elementId").on('click', function(event){ 
+0

即使這樣,客戶端仍會再次點擊點擊,但只是點擊了特定的元素。客戶端需要區分其發出的點擊和點擊其他客戶端發出的點擊。所以它上的套接字只能複製來自不同客戶端的點擊。但是發現遞歸問題。 – ste2425

相關問題