Javascript 如何防止使用jquery和socket.io添加多个事件侦听器

Javascript 如何防止使用jquery和socket.io添加多个事件侦听器,javascript,jquery,socket.io,Javascript,Jquery,Socket.io,我有一个函数可以在$('.message input'上设置侦听器 它在活动状态中被调用 socket.on('roomStatus', function(room){ addEasterEgg(room); }); 每次有人加入房间时都会触发roomStatus事件。因此,如果文件室首先有1个人,则会触发该文件室=[“Zf17x3UsNUdgMJ3UAAAD”],然后当另一个人加入时,会再次触发该文件室=[“Zf17x3UsNUdgMJ3UAAAD”,“ksxzbQhe0GuZqhMyA

我有一个函数可以在$('.message input'上设置侦听器

它在活动状态中被调用

socket.on('roomStatus', function(room){
  addEasterEgg(room);
});
每次有人加入房间时都会触发roomStatus事件。因此,如果文件室首先有1个人,则会触发该文件室=[“Zf17x3UsNUdgMJ3UAAAD”],然后当另一个人加入时,会再次触发该文件室=[“Zf17x3UsNUdgMJ3UAAAD”,“ksxzbQhe0GuZqhMyAAAE”]

所以在“focus”事件中,我得到两个console.logs(每个房间值一个)和room.length始终等于1,即使它后来变成了2

我相信这是因为我的方法被调用了两次,这意味着添加了两个侦听器。如果这是正确的,那么在下次调用roomStatus和addasteregg时,我应该如何删除上一个侦听器呢


谢谢,我找到了解决办法。看起来它确实是在向系统添加多个事件侦听器

$('.message-input')
因此,只需在添加之前删除任何剩余的事件侦听器即可修复它

$('.message-input').off('focus')
添加到:

function addEasterEgg(room){
  $('.message-input').on('focus', function(event) {
    event.preventDefault();
    console.log('room', room)
    if (room.length === 1) {
      displayStatus("No-one's there!!")
    };
  });
}

我找到了解决办法。看起来它确实是在向系统添加多个事件侦听器

$('.message-input')
因此,只需在添加之前删除任何剩余的事件侦听器即可修复它

$('.message-input').off('focus')
添加到:

function addEasterEgg(room){
  $('.message-input').on('focus', function(event) {
    event.preventDefault();
    console.log('room', room)
    if (room.length === 1) {
      displayStatus("No-one's there!!")
    };
  });
}

您的“on”函数是否由“while”或“for”循环包装?只需在回调外部委托侦听器一次。由于回调似乎没有执行任何DOM插入,因此您甚至可能不需要delegationIs您的“on”函数由“while”或“for”循环包装,只需将侦听器委托到回调之外即可。因为回调似乎没有执行任何DOM插入,所以您甚至可能不需要委托