我在网上搜索了这个问题,但我一无所获:
后退按钮的逻辑是什么?当我们点击Web浏览器上的后退按钮时会发生什么?
我真的想了解更多。
谢谢。
答案 0 :(得分:92)
您的网络浏览器会保留您在该窗口中访问过的网页的堆栈(或列表,如果您愿意)。假设您的主页是google.com,并从那里访问其他一些网站:youtube.com,yahoo.com和cnn.com。在访问最后一个时,列表如下所示:
google.com -> youtube.com -> yahoo.com -> cnn.com
^
|
current page
当您按“返回”按钮时,浏览器会将您带回列表中的上一页,如下所示:
google.com -> youtube.com -> yahoo.com -> cnn.com
^
|
current page
此时您可以再次按“返回”将您带到youtube.com,或者您可以按“转发”再次将您转到cnn.com。假设您再次按Back:
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,作为简短示例),其中包含要浏览的产品的类别和子类别。网站设计师在窗口顶部附近仔细提供breadcrumbs,以便您浏览类别。从网站的首页开始,点击硬件,然后点击内存。该列表现在看起来像这样:
google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem
^
|
current page
您想要返回硬件类别,因此您使用面包屑转到父类别而不是使用“后退”按钮。现在浏览器列表如下所示:
google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw
^
|
current page
根据网站结构,您向后(向上),但是由于您点击了链接,因此您向前移动了浏览器。只要您点击链接或在地址栏中输入URL,就浏览器而言,无论该链接是否带您进入您已去过的页面,您都可以继续前进。
最后,您想要返回主站点页面(ne.com)。你可以使用面包屑,但这次你点击后退按钮 - 很明显,它应该会让你上升一级,对吧?但是你需要在哪里?
最初让很多用户感到困惑(包括我自己,当我碰巧做到这一点时),它会让你“降低”一个级别,回到内存类别。查看页面列表,很容易理解为什么:
google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw
^
|
current page
要仅使用“返回”按钮返回主页,则需要再按两次,将“返回”硬件类别,最后返回主页面。对我们的程序员来说,这似乎是显而易见的,但是它常常让普通用户感到惊讶,因为他们没有意识到浏览器对他们碰巧在哪个网站的层次结构一无所知。
如果浏览器让网站设计师编写Back按钮来执行显而易见的事情(提升你的水平)而不是现在做什么,那会不会很棒?
编辑:评论者询问浏览器是重新加载页面还是仅将其显示在本地缓存中。
答案取决于它。网站设计者可以指定浏览器是否应该缓存页面。对于设置为非缓存的页面,浏览器会在您按Back时从服务器重新加载页面,就好像这是您第一次访问它时一样。对于缓存页面,浏览器会将其显示在缓存中,速度要快得多。
答案 1 :(得分:5)
我喜欢将其视为重新发出我的最后一个请求。如果你执行了一个简单的GET,它可能会返回与上次相同的东西(减去动态内容)。如果您已完成POST,则表示您要将表单(确认后)重新提交给服务器。
答案 2 :(得分:2)
基本思路是返回最后一页或逻辑站点分区。
查看Gmail,您会看到是否进行了搜索并点击了一条消息,然后点击后退按钮,它会将您带回到您所做的搜索中。
当您在大多数浏览器中单击它时,它将重新发送最后一个http请求,或者如果浏览器缓存网站,则会加载缓存。
答案 3 :(得分:2)
我认为最简单的解释方法是使用伪代码:
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)
答案 4 :(得分:1)
查看的页面历史记录以堆栈形式保存。当你“弹出”前三个页面(例如A,B,C)然后转到另一个页面D时,你不能通过向前击中再次到达B.
答案 5 :(得分:0)
作为一个devoloper,你应该确保你的webapp无论浏览器如何处理Back按钮都能正常工作:-)是否重新发送请求?新请求是否与旧请求相同,或者它是否有任何不同之处?浏览器会要求用户确认重新发布吗?将重新请求页面的哪些元素以及从缓存加载的内容?浏览器是否会尊重我的缓存控制标头?
这些问题的答案取决于make,浏览器版本和用户设置。设计你的软件,以便所有这些都无关紧要。
很抱歉没有非常直接的回答,但这里已有一些直接的答案。
答案 6 :(得分:0)
浏览器始终存储页面以便记忆,当我们按下后退按钮时 它不会将请求发送到上一页的服务器,而只是看到它的缓存 它存储页面的位置,它遵循LIFO规则,这就是为什么它首先给我们这个页面 按下我们在最后打开的后退按钮
答案 7 :(得分:-1)
浏览器在当前页面之前加载最后查看的页面,然后跟随可能发生的任何重定向?
我似乎忽略了问题的重点。