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循环是出乎意料的++行为的罪魁祸首。