4

我测试了 Chrome(linux 和 windows)、Firefox 和 Opera。

每次我执行 pushState 时,Chrome 都会访问服务器。它似乎没有以任何方式使用请求,我只是注意到它,因为我正在查看日志文件。

这是请求:

16 Mar 2013 01:00 PM ip=127.0.0.1 agent=Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 uri=/ T1=0ms T2=0ms T3=0ms 

这是代码行:

history.pushState({}, 'my_app', URL);

我知道 URI 说“/”,但这甚至不是被推送的 URL。

Firefox 和 Opera 不这样做,这对我来说似乎是不正确的行为。是bug吗?

我担心的原因是缩放。我不希望用户在浏览我的应用程序时发出虚假请求。

4

1 回答 1

7

@JavascriptNewbie - 你并不孤单:D

恭喜你成为地球上(或至少在互联网上)唯一一个注意到这一点并且足够熟练地检查你的臭日志的人。

优点:Chrome 和 Firefox 可以根据需要进行预取,有时还可以使用 pushState 来使后退/前进更好。在您的情况下,它看起来至少由于您的页面中的某些内容而中止了“预渲染”......但您可能想检查它是否也在预取并执行您的链接脚本或样式。

简而言之:Chrome 和 FireFox 可能决定从服务器获取 pushState/replaceState url,以便能够优化它们的后向/前向缓存,以防人们从导航栏中复制和粘贴 url。这是不确定的,并不总是发生。

The Long:情况会变得更糟,除非您遇到此处提到的限制条件之一:https ://developers.google.com/chrome/whitepapers/prerender Chrome 会实际解释并执行您的 javascripts ......这可能会触发 AJAX 之类的事情,甚至是 Websockets。

The Longer:我在这里完成了一个测试套件和文章:https ://github.com/nickhsharp/prefetchNightmare ,它最终可能会成为一篇博文。

于 2013-09-19T17:55:26.557 回答