不刷新的“重定向”页面(Facebook 照片样式)
Posted
技术标签:
【中文标题】不刷新的“重定向”页面(Facebook 照片样式)【英文标题】:"Redirect" page without refresh (Facebook photos style) 【发布时间】:2011-05-02 06:26:32 【问题描述】:当用户浏览照片时,我正在尝试像在 Facebook 上那样实现内容浏览。我想每个人都熟悉照片浏览,您可以单击“下一张”和“上一张”并立即获取下一张或上一张照片(您也可以使用箭头键导航)。
例如,当您单击“下一步”时,您会注意到页面没有刷新 - 只有内容。起初我认为它是使用普通的 ajax 调用来完成的,在这种情况下,它只刷新“内容”,即图像、描述和 cmets。但后来我注意到浏览器“位置”工具栏中的 URL 也发生了变化! 我尝试使用 Firebug 进行检查,发现当您单击“下一步”时,仅下载下一张照片,我仍然不知道从哪里加载 cmets 和图像元数据(描述、时间、标签……) .
谁能解释一下这种技术是如何完成的 - 页面 URL 在没有页面刷新的情况下更改(如果从缓存中刷新,甚至没有页面“闪烁”)。 我知道如何使用 ajax 更改页面内容,但该页面的 URL 始终保持不变。如果我点击“刷新”按钮,我会再次获得第一页。但不是在 Facebook 上,因为即使是“window.location”每次都会更改而没有实际重定向。
我注意到的另一件事是底部工具栏(应用程序、聊天...)“始终位于顶部”。即使您更改页面,此工具栏也不会刷新并且始终保持在顶部 - 它甚至不会像其他刷新的页面(来自网络服务器或来自本地缓存)那样“闪烁”。我想这与上面的技术相同——某种“假”重定向或其他什么?
答案是 pushState
if (window.history.pushState)
window.history.pushState([object or string], [title], [new link]);
你会微笑:)
【问题讨论】:
对于它的价值History.js 提供相同的 html5 API,同时优雅地降级任何不支持它的浏览器(包括对数据和标题的支持,以及 replaceState 功能)。使用它意味着您不必为 IE9 更改更改代码。 【参考方案1】:我尝试通过 facebook 图片进行更改,这就是我所看到的:
在 Firefox 中:
页面 URL 没有改变。只有哈希值在变化。 This is a technique used to allow crawlers to index the content。会发生什么:
用户点击“下一步” JS 用标签、cmets 等加载下一张图片,并用它们替换旧的内容。 JS 更改哈希以对应新图像网址如下所示:
http://www.facebook.com/home.php?#!/photo.php?fbid=1550005942528966&set=a.1514725882151300.28042.100000570788121&pid=3829033&id=1000001570788121
(注意哈希)
至于第二个问题,这只是上述技术的一个好处。当您在 facebook 上时,页面很少真正刷新。仅更改哈希值,以便您可以将链接发送给其他人,并且爬虫可以索引内容。
在谷歌浏览器中:
似乎chrome有一些方法可以在不刷新页面的情况下更改url。它通过使用window.history.pushState
来做到这一点。阅读它here。
url 看起来像这样:http://www.facebook.com/photo.php?fbid=1613802157224343&set=a.1514725288215100.28042.1000005707388121&pid=426541&id=1000001570788121
(请注意这里没有哈希,但 url 仍然随着图像而变化)
在Epiphany:
图像更改时,Epiphany 不会更改 URL。
url 看起来像这样:http://www.facebook.com/photo.php?fbid=1441817122377521&set=a.1514725882215100.28042.1000005707848121&pid=3251944&id=1000200570788121
(没有哈希,更改图片时 URL 保持不变)
(暂时没有其他浏览器可以验证)
【讨论】:
同意。感谢您的解释,我将添加有关 pushState 的代码。 也许当你回答这个问题时,他们使用哈希更改来加载新图像,但现在当你点击下一步按钮时,url 本身会发生变化,但不会刷新。即使您单击主页 url 中的热门新闻,但页面不会刷新。我真的很好奇它是如何工作的。 @UberGeek AFAIK firefox(我假设你在谈论它)在新版本中支持window.history.pushState
【参考方案2】:
这里没有提到的一种技术是他们可能使用过的 window.onhashchange() 方法(在 ie8+ 和大多数其他中都支持)
【讨论】:
我相信这正是发生的事情,而不是相反。下一个和上一个链接只是更改哈希值,javascript 代码会做出反应并加载相关照片。【参考方案3】:您可能会注意到页面 url 保持不变。然而,改变的是页面哈希(URL 中 # 之后的部分)。
你需要这样的东西:http://code.google.com/p/reallysimplehistory/
【讨论】:
这是不正确的。图片网址在我的 chrome 网址栏中显示为http://www.facebook.com/photo.php?fbid=135122293393816&set=t.1575828580&pid=8182864&id=15752828580
,但其中没有 #
。
@Gabi:Chrome 支持 window.history.pushState,因此在 Chrome 中可以更改 URL 栏而无需强制重新加载。在其他浏览器(Firefox、IE)中,URL Bar 只能通过 window.location.hash 方法更改,该方法在 URL 末尾的哈希标记之后附加更改数据(或检索数据)。以上是关于不刷新的“重定向”页面(Facebook 照片样式)的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 URL 更改而不是页面重定向进行 ajax 加载?
获得权限后的 Facebook 登录让 Safari 空白页面打开,而不是在 iOS 10 和 iOS 11 中重定向到我的应用