1.3.1 window.history.go

window.history.go方法可加载历史列表中的某个特定具体的页面,用来完成在用户历史记录中向后和向前的跳转。其签名为:

入参可以是数字,移动历史栈中栈指针的相对距离,“-1”表示后退到上一个页面,“1”表示前进一个页面。在某些浏览器中,也可通过单击“前进”和“后退”按钮旁的历史栈菜单按钮选择需要导航到的页面,这对应于history.go(1)、history.go(2)、history.go(-2)等。注意,IE浏览器支持传递URL作为参数给history.go函数,但这是不标准的。

对于history.go(0),其意义为刷新当前页面,与location.reload方法行为一致。

对于历史栈指针的移动,如图1-5所示。

history.go方法仅移动栈指针,不会修改栈记录,不会对栈的记录数量造成影响。

history.go与history.pushState相比,history.pushState并不会造成页面刷新,而history.go跳转页面的刷新行为视具体情况而定。history.go与history.pushState的主要区别是,一个不产生历史栈,仅控制栈指针在栈内移动,一个产生历史栈。在行为上,history.go等同于浏览器的“前进”和“后退”按钮,其调用会触发popstate事件;而history.pushState会清空当前指针位置之上的所有历史栈,并入栈一个历史记录作为栈顶,同时移动指针指向它。有一个容易产生的误区:在history.pushState被调用多次后,单击浏览器的“后退”按钮,浏览器就会完成历史栈的出栈操作。事实上,这时候栈的数量并不会改变。单击浏览器的“前进”和“后退”按钮,包括执行history.go等操作都仅是移动指向栈记录的指针,造成指针位置的改变,浏览器并不会进行出栈。如果需要改变栈的数量,则需要执行history.pushState。假如一个历史栈有3个记录且指针指向栈顶,那么当执行2次后退操作后,指针后退到栈底,这时history.length还是3;当再执行一次history.pushState时,会产生一个新的栈顶并指向它,history.length将变为2,进而才改变了history.length。注意,history.pushState永远产生新的栈顶并指向它。

图1-5 栈指针在栈内移动

window.history.state作为常量不能直接修改,如window.history.state={}的赋值将不会成功。