gpt4 book ai didi

javascript - Safari 4.0.4 中的意外 setTimeout 行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:52:17 24 4
gpt4 key购买 nike

此行为似乎只发生在最新版本的 Safari (4.0.4) 中。使用下面的示例,页面将在 60 分钟后创建一个警告框。如果您打开以下页面,点击 Google 链接,然后点击浏览器的后退按钮,则什么也不会发生。这按预期工作。

但是,如果我在 Safari 中打开以下页面,点击链接,然后点击后退按钮,警告框将立即出现。这似乎只在第一次尝试时发生,在我进行硬刷新或完全关闭 Safari 之前不会再次发生。

这是预期的吗?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>
<script type="text/javascript">
window.onload = function() {
setTimeout(function() {
alert('hit');
}, 60 * 60 * 1000);
}
</script>
</head>

<body>
<a href="http://www.google.com">Click me, then press the browser's back button.</a>
</body>

</html>

最佳答案

好地方!确认。

这与后退/前进按钮缓存有关。当您在 Firefox 或 Safari(但不是 Chrome)中离开页面时,它会保持旧页面仍然加载,只是隐藏。如果您点击“返回”,它可以重新显示页面,而无需重新解析它并重新运行所有 JavaScript,从而实现更快的导航(对于开始通过 AJAX onload 获取内容的页面特别有用)。

在 Firefox 中,超时将触发的时间是保留的,因此如果您在超时前还有 5 秒,请离开页面,等待三秒然后返回,超时将在两秒后触发。如果超时会在您离开页面时触发,当您返回时它会立即触发。 Safari 当前似乎会在返回页面时触发所有 剩余超时,而不仅仅是过去计划触发的超时。在我看来,这是一个错误。想举报还是我举报?

您可以通过让超时函数在执行操作之前通过 new Date().getTime() 检查实时时间来解决这个问题。无论如何,这有时对某些类型的超时很有用,因为回调时间可能会由于浏览器繁忙或页面从 bfcache 中隐藏而倒退。但是由于这个错误,它现在也可以向前移动。不幸的是,Safari 似乎也没有实现 Firefox 引入的与 bfcache 一起使用的 onpagehide 功能,因此您无法捕捉到它。

另一种选择是浏览器嗅探 Safari 并在发现时通过设置 window.onunload 函数禁用 bfcache————即使是什么都不做。 Firefox 和 Safari 将此视为页面希望在离开时真正卸载的信号。

关于javascript - Safari 4.0.4 中的意外 setTimeout 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2087551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com