felix-cao / Blog

A little progress a day makes you a big success!
31 stars 4 forks source link

JavaScript BOM --- History 浏览历史记录对象 #104

Open felix-cao opened 5 years ago

felix-cao commented 5 years ago

window.history 是一个只读属性,用来获取 History 对象引用。History 保存着用户浏览历史记录,它对象提供了操作浏览器会话历史(浏览器地址栏中访问的页面,以及当前页面中通过框架加载的页面)的接口。

从中我们可以提取三点信息:只读属性、History的实例、可以操作浏览器 session 级别的 url

一、window.history 是一个只读属性

二、history 对象

history 对象保存着用户的上网历史,从用户窗口的时候就开始记录。historywindow 对象的属性,所以每个浏览器窗口、标签、框架都有自己的 history 对象,并与其自己的 window 对象关联。

三、操作 session 级别的 url

前面讲了这么多,history 到底有啥用途呢?

我们做一个不是很恰当的比方。我们看做 history 内部有一个栈,这个栈用来存放当前浏览器 session 级别(关闭前)的同一个 tab 下所有访问过的 url ,当然这个栈是不可见的(出于安全的角度)。

从图中我们可以看到,history 对象并没有暴露存放历史 url 的属性。所以我们并不能通过类似如下方法操作会话历史:

window.history.url = "http://www.up8.wang"

这种方法是不可行的,也是非常不安全的。W3C 也是出于安全的角度规定了不对外部暴露这样的属性。

四、history 的属性及方法

那么,我们可以通过哪些属性和方法来操作浏览器的会话历史呢?

我们来看看 w3cHistory 接口的定义:

interface History {
  readonly attribute unsigned long length; 
  attribute ScrollRestoration scrollRestoration;                                //HTML5.1
  readonly attribute any state;                                                        //HTML5
  void go(optional long delta = 0);
  void back();
  void forward();
  void pushState(any data, DOMString title, optional DOMString? url = null);         //HTML5
  void replaceState(any data, DOMString title, optional DOMString? url = null);      //HTML5
};

4.1、length 属性

length 属性是记录进入会话历史的 url 的数目,注意是 readonly !

当我们第一次打开浏览器后,在控制台中输入 history.length, 得到 1, 在地址栏,每输入一次网址回车后,其 length 加 1, 即使连续输入的是同一个地址。

4.2、back 方法

此方法忽视一切参数,如果已经到最早的一个,则再次调用不做任何处理。

4.3、forward 方法

调用次方法相当于点击浏览器的前进按钮。 此方法忽视一切参数,如果已经到最新的一个,则再次调用不做任何处理。

4.4、go 方法

可加载历史列表中的某个具体的页面 此方法的推荐参数为整数类型,如果传入的是浮点数,则自动舍去小数位。 传入负数: 后退 传入整数: 前进 传入0或非数值类型: 刷新当前页面 传入的数值超出前进或后退的范围: 不做任何处理