Web浏览器中的“后退”button如何工作?

我在网上search了这个问题,但是我什么都没发现:

什么是后退button的逻辑? 当我们点击Web浏览器的后退button时发生了什么?

我真的想更多地了解这一点。

谢谢。

您的networking浏览器会保存您在该窗口中访问的网页的堆栈(或列表,如果您愿意的话)。 假设您的主页是google.com,从那里您可以访问其他几个网站:youtube.com,yahoo.com和cnn.com。 在访问最后一个时,列表如下所示:

google.com -> youtube.com -> yahoo.com -> cnn.com ^ | current page 

当您按下“后退”button时,浏览器会将您带回列表中的上一页,如下所示:

 google.com -> youtube.com -> yahoo.com -> cnn.com ^ | current page 

此时,您可以再次按“返回”将您引导至youtube.com,也可以按“转发”将您再次转到cnn.com。 假设您再次按“返回”:

 google.com -> youtube.com -> yahoo.com -> cnn.com ^ | current page 

如果您现在转到abc.com,则列表将更改为如下所示:

 google.com -> youtube.com -> abc.com ^ | current page 

请注意,yahoo.com和cnn.com都不在列表中。 这是因为你采取了新的路线。 浏览器只保留你访问过的页面的列表,而不是你曾经去过的每一页的历史。 浏览器也不知道你正在访问的网站的结构,这可能会导致一些令人惊讶的行为。

你正在一个购物网站(ne.com,作为一个简单的例子),有产品的类别和子类别浏览。 网站devise师已经仔细地提供了靠近窗口顶部的面包屑 ,以便您浏览类别。 你从网站的首页开始,点击硬件,然后点击内存。 该列performance在看起来像这样:

 google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem ^ | current page 

你想回到硬件类别,所以你使用面包屑上升到父类别,而不是使用后退button。 现在浏览器列表如下所示:

 google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw ^ | current page 

根据网站结构,你倒退了(上一级),但是你浏览器,因为你点击了链接。 无论何时您点击链接或在地址栏中inputurl,您都会前往浏览器,无论该链接是否会将您带到您已经访问过的页面。

最后,你想返回到主网站页面(ne.com)。 你可以使用面包屑,但这次你点击后退button – 很明显,它应该带你一个级别,对吧? 但是,它在哪里呢?

最初,许多用户(包括我自己,当我碰巧做到这一点)会让你“失望”一个级别,回到内存类别。 看看页面列表,很容易看出原因:

 google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw ^ | current page 

要仅使用“返回”button返回主页面,则需要再按两次,才能将其“返回”到“硬件”类别,最后返回到主页面。 对于程序员来说,这似乎是如此明显,但是它却一直让普通用户感到惊讶,因为他们没有意识到浏览器对任何网站的层次结构都不了解。

如果浏览器能够让网站devise者编程“后退”button来做明显的事情(带你上一个关卡),而不是现在做什么,那么这样做会好吗?

编辑:一位评论者询问浏览器是重新加载页面还是简单地将其显示在本地caching之外。

答案是视情况而定。 网站devise者可以指定浏览器是否应该caching页面。 对于设置为非高速caching的页面,浏览器在您按Back时重新加载服务器的页面,就好像这是您第一次访问它。 对于caching页面,浏览器将其显示在caching之外,速度更快。

我喜欢把它看成是重新发出我最后的要求。 如果你执行了一个简单的GET,它可能会返回与上次一样的东西(减去dynamic内容)。 如果您已经完成POST,您将重新提交表单(确认后)到服务器。

基本的想法是回到最后一页或逻辑站点的划分。

看着Gmail,你会看到如果你做search,然后点击一条消息,然后点击后退button,你会回到你做的search。

在大多数浏览器中单击它时,它将重新发送最后一个http请求,或者在浏览器caching站点时加载caching。

我认为解释这个最简单的方法是伪代码:

 class Page: String url, ... Page previous, next # implements a doubly-linked list class History: Page current # current page void back(): if current.previous == null: return current = current.previous refresh() void forward(): if current.next == null: return current = current.next refresh() void loadPage(Page newPage): newPage.previous = current current.next = newPage # remove all the future pages current = current.next display(current) 

浏览的页面的历史保持堆栈式的forms。 当你“popup”前三页(例如,A,B,C),然后转到不同的页面D时,通过前进不能再次到达B.

作为devoloper,无论浏览器如何处理Backbutton,你都应该确保你的web应用程序能够正常工作:-)是否重新发送请求? 新的请求是否与旧的请求相同,还是有所不同? 请问浏览器请求用户确认重新POST? 页面的哪些元素将被重新请求以及从caching中加载了哪些内容? 浏览器会尊重我的caching控制标题吗?

这些问题的答案取决于make,浏览器版本和用户设置。 devise你的软件,所有这些都不重要。

对不起,不是很直接的答案,但这里已经有一些直接的答案了。

一个浏览器总是存储页面的记忆,当我们按下后退button,它不会发送请求到前一页的服务器,而只是看到它的caching存储页面,它遵循LIFO规则,这就是为什么它先按下我们最后打开的后退button,给我们那个页面

浏览器加载当前页面之前的最后浏览页面,然后遵循可能发生的redirect?

我似乎错过了这个问题的重点。