javascript - JavaScript 是单线程的吗?如果没有,我如何获得对共享数据的同步访问?

标签 javascript multithreading browser dhtml simile

我有一个包含 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/

相关文章:

multithreading - 并发和线程书籍

multithreading - Rust 中的 std::sync::Arc of trait

java - 何时线程。何时不使用线程

http - 我可以在到达时呈现文本/纯内容吗?

html - 表单中的什么因素导致浏览器后退按钮不起作用?

javascript - 如何为带有验证的表单中的所有字段提供相等的宽度?

javascript - WebStorm 认为错误构造函数的参数为​​零

javascript - 如何在单击的某些元素上忽略 Bootgrid 单击事件

javascript - 当我格式化两个不同的时间时,它们都会同时出现,有办法解决这个问题吗?

javascript - 如何从 tabindex 流程中删除浏览器功能?