微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

事件侦听器以什么顺序添加到调用堆栈中?

如何解决事件侦听器以什么顺序添加到调用堆栈中?

我正在用 js 编写滚动同步模块,并且遇到了一些非常意外的行为,即滚动事件的触发方式。从代码开始:

const attach = (element) => {
  // synchronizedElements is in scope because of closures
  const onScrollListener = () => {

    // first detach all other listeners
    synchronizedElements.current.forEach((listener,el) => 
      if(el !== element) el.removeEventListener('scroll',listener)
    );
    

    // synchronize all of the other elements with the leader
    syncFollowers({leader: element,synchronizedElements});

    // then re-attach all of the other listeners
    synchronizedElements.current.forEach((listener,el) => 
      if(el !== element) el.addEventListener('scroll',listener)
    );
  }
  synchronizedElements.current.add(element,onScrollListener);
  element.addEventListener('scroll',synchronizedElements);
}

有了这个,我希望滚动第一个元素来调用它的侦听器。它将承担领导者的角色并移除所有其他元素; (followers) 所以它可以移动他们的滚动位置而无需他们触发 onScrollListeners 响应。然后重新吸引听众,让他们再次成为领导者。这很关键,因此关注者不会尝试做完全相同的事情。

相反,在领导者完成后,追随者的听众也会立即被调用。我想要做的就是在领导者滚动时绕过非领导者的滚动事件。

我想知道 removeEventListener + addEventListener 是否已排队并且直到整个函数完成后才真正执行,因此当领导者移动它们时,追随者仍然附有他们的听众。有什么想法吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。