我有一个包含 DIV
的网页,其中包含一个 mouseover
处理程序,旨在显示弹出信息气泡。我不希望一次显示多个信息气泡。但是当用户在两个项目上快速移动鼠标时,有时会出现两个气泡。这不应该发生,因为显示弹出窗口的代码取消了之前的弹出窗口。
如果这是一个多线程系统,那么问题就很明显了:有两个线程试图显示一个弹出窗口,它们都取消了现有的弹出窗口,然后弹出了自己的弹出窗口。但我假设 JavaScript 始终是单线程运行的,这会阻止这种情况发生。我错了吗?事件处理程序是否异步运行,在这种情况下我需要同步访问共享数据,或者我应该在库代码中寻找错误以取消弹出窗口?
编辑添加:
- 有问题的图书馆是SIMILE Timeline及其 Ajax 库;
- 事件处理程序确实调用了
SimileAjax.DOM.cancelEvent(domEvt)
,我根据名称假设它取消了事件的冒泡; - 只是为了让事情变得更复杂,我实际上正在做的是开始一个超时,如果没有被
moustout
取消则显示弹出窗口,这是为了防止弹出窗口恼人地闪烁但令人讨厌的是产生了相反的效果。
我会再戳一下,看看我是否能弄清楚哪里出错了。 :-)
最佳答案
是的,Javascript 是单线程的。即使使用 Google Chrome 等浏览器,每个标签页也有一个线程。
不知道您是如何尝试从另一个弹出窗口中取消弹出窗口的,因此很难说出问题的原因。
如果您的 DIV 相互嵌套,您可能会有一个 event propagation问题。
关于javascript - JavaScript 是单线程的吗?如果没有,我如何获得对共享数据的同步访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/161783/