socket.io给出了两个响应,但只有一个是被忽视的

我正在写一个使用socket.io的程序。 在这个特定的部分,我发送一个请求并处理答案。

客户端:

// .... socket.emit('opendrow', a.id); socket.on('opendrowresponse', function(msg) { console.log(msg); cell.innerHTML = msg; // .... 

服务器侧手柄:

 // .... socket.on('opendrow',function(msg) { console.log(msg); connection2.query('SELECT * FROM testpreis WHERE id = '+msg, function(err,rows,fields) { if (err) throw err; io.to(socket.id).emit('opendrowresponse',rows) }); }); // .... 

客户端代码在点击function中:

 var plusrow = document.getElementsByClassName('plusrow'); for (var i = 0;i<plusrow.length;i++) { plusrow[i].addEventListener('click', collapse); } 

崩溃函数基本上是扩展一个表,发送请求并在创build的表格行中插入响应。

我在第一次点击“plusrow”时得到了这个回应:

 Array [ Object ] 

这是预期的回应。

但是,如果我点击另一个表格行,我会得到两个相同内容的结果集

 Array [ Object ] Array [ Object ] 

并且对于每一次连续的点击,我都会得到更多的对象数组,尽pipe只有一个数组是期望的。
答案是正确的,所以如果我要求例如。 ID 50,对于ID 50有两个响应,或对于50有三个响应,取决于我之前做了多less点击。

我已经检查了服务器端控制台,并做了请求的ID的console.log:

 socket.on('opendrow',function(msg) { console.log(msg); 

而对此的回应如预期的那样只有一个id,例如。

 51 

我认为崩溃函数的其余部分与它没有关系,但是这里是:

 function collapse() { var table = document.getElementById('pricingtable'); var a = this; var aclassName = a.className.replace(' openchild',''); console.log(a.className); console.log(a.className.indexOf('openchild')); if (a.className.indexOf('openchild') >= 0) { var childtodel = document.getElementById(a.id+'sub'); console.log(childtodel.rowIndex); table.deleteRow(childtodel.rowIndex); a.className = aclassName; } else { document.getElementById(a.id).className += ' openchild'; console.log (a.id); console.log(a.parentNode.rowIndex); var element = table.insertRow(a.parentNode.rowIndex + 1); element.id = a.id+'sub'; //element.innerHTML = 'sdfalkj'; var cell = element.insertCell(0); cell.colSpan = 8; socket.emit('opendrow', a.id); socket.on('opendrowresponse', function(msg) { console.log(msg); cell.innerHTML = msg; }); } } 

有人可以解释为什么不只有一个响应,但每次点击更多?

我应该改变什么?

事件代表团可以从这个混乱中拯救你。 基本上,您将事件侦听器添加到父对象,并在事件发生时响应。

http://davidwalsh.name/event-delegate

我无法确定导致行为的代码中的确切位置,但是我的直觉告诉我它是for循环的附加事件监听器。 For循环是出乎意料的++行为的罪魁祸首。