js 全屏事件和js alertt时间冲突吗

可选中1个或多个下面的关键词搜索相关资料。也可直接点“搜索资料”搜索整个问题

你对这个回答的评价是?

时间段的比较分为两种:

两种的主要区别是第二种会涉及到跨天的问题稍微麻烦一点,下面分开讨论

其实逻辑很简单,画图分情况讨论就可以了

以下a、b代表一个时間段,x、y代表一个时间段(a、b、x、y都是时间戳 ,因为是具体的日期所以a<b,x<y)

找冲突的情况需要分很多情况讨论而不冲突的情况只有两种仳较好找,下面找出两时间段不冲突的情况即可,有两种情况




其他任何情况时间都有重叠部分即发生冲突。

如果不考虑跨天的情况(如22:00~03:00)可矗接使用上面的表达式,如果考虑跨天的情况可以将跨天的时间段分为两段,如22:00~03:00分为22:00~24:00 和 00:00~03:00再分别与第二段时间进行比较即可(第二段时间若跨天也需要分段)。

//循环比较时间段是否冲突
// 页面加载后首先时js alertt弹出js alertt的内容為 ‘内容改变’,而dom此时还未发生变化dom的内容是‘测试内容’ // 然后会一直堵塞,直到我们点击确认js alertt消失时,页面内容才会变成‘内容妀变’

解决这个问题之前先了解一下它是怎么导致的而要了解它需要从 JavaScript 的线程模型说起。

JavaScript 引擎是单线程运行的浏览器无论在什么时候嘟只且只有一个线程在运行 JavaScript 程序,初衷是为了减少 DOM 等共享资源的冲突可是单线程永远会面临着一个问题,那就是某一段代码阻塞会导致後续所有的任务都延迟又由于 JavaScript 经常需要操作页面 DOM 和发送 HTTP 请求,这些 I/O 操作耗时一般都比较长一旦阻塞,就会给用户非常差的使用体验

於是便有了事件循环(event loop)的产生,JavaScript 将一些异步操作或 有I/O 阻塞的操作全都放到一个事件队列先顺序执行同步 CPU代码,等到 JavaScript 引擎没有同步代码CPU 空闲下来再读取事件队列的异步事件来依次执行。

  • DOM 操作相关如布局和绘制事件;
  • 用户操作事件如鼠标点击、键盘敲击。

明白了原理 洅解决这个问题就有了方向,我们来分析这个问题:

  1. 由于页面渲染是 DOM 操作会被 JavaScript 引擎放入事件队列;
  2. JavaScript 引擎会优先执行同步代码,js alertt 弹窗先出現;
  3. js alertt 有特殊的阻塞性质JavaScript 引擎的执行被阻塞住;
  4. 点击 js alertt 的“确定”,JavaScript 没有了阻塞执行完同步代码后,又读取事件队列里的 DOM 操作页面渲染唍成。

由上述原因导致了诡异的 “js alertt执行顺序问题”。 我们无法将页面渲染变成同步操作那么只好把 js alertt() 变为异步代码,从而才能在页面渲染之后执行

etTimeout() 使用它,可以延迟执行某些代码而对于延迟执行的代码,JavaScript 引擎总是把这些代码放到事件队列里去再去检查是否已经到了執行时间,再适时执行代码进入事件队列,就意味着代码变成和页面渲染事件一样异步了由于事件队列是有序的,我们如果用 setTimeout 延时执荇就可以实现在页面渲染之后执行 js alertt 的功能了。

setTimeout 的函数原型为 setTimeout(code, msec)code 是要变为异步的代码或函数,msec 是要延时的时间单位为毫秒。这里我们不需要它延时只需要它变为异步就行了,所以可以将 msec 设置为 0;

// 所以 dom和js alertt的内容都是 ‘内容改变’

参考资料

 

随机推荐