1

假设我们收到了某个onClick事件div,但在此之前,我们需要使用 jQuery 完成一个大计算,这需要大约 3 秒,而 jQuery 目前很忙,所以它无法识别我的事件调用。

所以,1 秒钟过去了,我点击了这个框。没发生什么事?2 秒。没发生什么事?3 秒,jQuery 完成了他当前的任务。我的onclickjQuery 事件有效并且该框消失了。

问题是; 在这种情况下 jQuery 会做什么?自动创建一个线程来立即执行我的 onclick 事件?排队通话?(所以它会在任务完成后执行我的 3 次点击,因此会调用 3 次事件)完全忽略前 2 次调用?另外,我应该怎么做才能避免这种问题?

4

3 回答 3

3

JavaScript 像单线程一样运行。我的理解是,某些浏览器在实际实现中有所不同,但是编写脚本并期望它们将线性执行是安全的。

看到这个问题

我想您的浏览器会在被阻止的 UI 期间将点击排队,但由浏览器决定如何处理这种情况。(我的 Chrome 在被阻止的 UI 期间排队点击事件)

也就是说,在较新的浏览器中实现了一个很酷的功能:

网络工作者

它允许您在后台执行昂贵/长时间的操作而不会阻塞 UI。如果您的脚本将在大多数新浏览器上运行,则可能值得深入研究此功能。奖励:那篇文章是由 jQuery 的鼻祖写的!=)

于 2012-12-09T01:14:31.920 回答
1

您可能会使用加载栏或页面刷新元素来通知用户后台正在发生某些事情。

于 2012-12-09T01:28:19.507 回答
0

看看这个 jsfiddle。正如 Shad 所说,在 Chrome 上,点击会排队,计算完成后会处理事件。一件奇怪的事情是,大计算之前的行

E('status').innerHTML = "Status: started";

似乎直到之后才被执行。另一个令人惊讶的事情是通过重复一些操作 10,000 或 100,000 次让整个浏览器挂起是多么容易。

如果服务器端解决方案不可行,解决方案可能是将计算分解为更小的操作批次,并以几毫秒的间隔一次执行一个批次,以允许代码的其他部分进行操作。与此同时,您可能需要“请稍候”消息。

于 2012-12-09T01:46:33.913 回答