【发布时间】:2017-11-05 07:36:15
【问题描述】:
下面的代码给出的输出为
应该先被调用>> false
hidden.. 停止运行昂贵的任务
它似乎是第一次按顺序运行以进一步重新加载页面,它以某种方式缓存我猜想的事件监听器..并给出以下输出。
hidden.. 停止运行昂贵的任务
应该先被调用>> false
console.warn("should have been called first >> "+ document.hidden);
/* event handlers */
document.addEventListener('visibilitychange', function () {
if (document.hidden) {
console.log("hidden.. stop running expensive task")
} else {
console.log("not hidden.. page has focus, begin running task")
}
});
2 个问题:
- 那么这是否意味着事件侦听器首先被附加到其他任何东西之前。
- 为什么第一次
document.hidden是假的?
我无法找到有关此行为的太多信息。
<!DOCTYPE html>
<html>
<script>
console.warn("should have been called first >> "+document.hidden);
/* event handlers */
document.addEventListener('visibilitychange', function () {
if (document.hidden) {
console.log("hidden.. stop running expensive task")
} else {
console.log("not hidden.. page has focus, begin running task")
}
});
</script>
<body>
<p>
Just create a html page with this code.
Open browser console. You'll see the console statements in sequesnce.
Now if you reload this html page, the statements are out of sequence.
Somehow event callback is called first before console statement "should have been called first"</p>
</body>
</html>
只需使用上面的 sn-p 代码创建一个 html 页面。 打开浏览器控制台。您将依次看到控制台语句。 现在,如果你重新加载这个 html 页面,语句就会乱序。 在控制台语句“应该首先调用”之前以某种方式首先调用事件回调
【问题讨论】:
-
您能否提供更多有关执行此操作的上下文?它是在页面上的脚本标签内,还是在 document.ready() 回调内等等?
-
都试过了,在onload里面,文件准备好了,或者只是在脚本标签里,结果一样
-
很遗憾,我无法重复您的问题。据我所知,控制台语句应该在事件监听器被附加之前触发(更不用说在事件触发之前)。尝试将 .warn() 更改为 .log() 以确保它不会影响事物,并尝试不同的浏览器。看看行为是否改变。
-
不。我复制了您的代码,按照您的要求进行了刷新。首先得到“应该首先调用>> false”,然后随着可见性的变化,可见性改变消息。刷新后一样。
-
你测试的是什么浏览器?
标签: javascript jquery html events dom