Javascript socket.io给出了两个响应,但只排除了一个响应

Javascript socket.io给出了两个响应,但只排除了一个响应,javascript,node.js,sockets,socket.io,Javascript,Node.js,Sockets,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.lo

我正在编写一个利用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)
    });
});
// ....
客户端代码位于单击功能中:

var plusrow = document.getElementsByClassName('plusrow');
for (var i = 0;i<plusrow.length;i++) {
plusrow[i].addEventListener('click', collapse);
}
这是预期的反应

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

Array [ Object ]
Array [ Object ]
对于每一次连续的点击,我会得到更多的对象数组,尽管只需要一个数组。
响应是正确的,因此如果我请求id 50,则id 50有两个响应,或者50有三个响应,这取决于我之前的点击次数

我已经检查了服务器端控制台,并对请求的id执行了console.log:

socket.on('opendrow',function(msg) {
    console.log(msg);
对此的响应与预期一样只有一个id,例如

51
我不认为塌陷函数的其余部分与此有关,但这里是:

函数折叠(){
var table=document.getElementById('pricingtable');
var a=此;
var aclassName=a.className.replace('openchild','');
console.log(a.className);
log(a.className.indexOf('openchild');
如果(a.className.indexOf('openchild')>=0){
var childtodel=document.getElementById(a.id+'sub');
console.log(childtodel.rowIndex);
table.deleteRow(childtodel.rowIndex);
a、 className=aclassName;
}
否则{
document.getElementById(a.id).className+='openchild';
console.log(a.id);
log(a.parentNode.rowIndex);
var元素=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',函数(msg){
控制台日志(msg);
cell.innerHTML=msg;
});
}

}
事件委派可以将您从这种混乱中解救出来。基本上,您可以将事件侦听器添加到父对象,并在事件冒泡时响应它们


我无法确定代码中导致该行为的确切位置,但我的直觉告诉我,在连接事件侦听器的for循环中。For循环通常是导致意外的++行为的罪魁祸首。

我猜您可能拥有用于
opendrowresponse
msg的双击处理程序或双侦听器。
51