昨天码代码时遇到一个问题,history.back()或go(x)、forward()之后,调用刷新location.reload()方法,怎么也跳转不到上一个页面。在此处写出昨天产生的一些疑问以及自己的一些理解,希望大家能够给出合理的指点,谢谢。

实际需求为:完成一个选人界面,移动端Web网页。(此处具体实现为单页面后台数据刷新,多页面或Ajax、本地存储等方式实现的请略过本文)

选人界面,最基本的结构:部门+人员,构成父节点+子节点的结构,选中父节点后刷新当前界面为选中节点的下级节点。

当进入多子级节点选人时,需要选择上级节点中的人,则此时需要返回功能,同时,返回后的界面应当保存上一次选择的人员的节点选中状态,选中的节点数据可通过多种方式实现存储,此处以本地sessionStorage+后台Session混合校验存储的方式进行实现,即将当前操作页面中选中的节点数据存至SessionStorage中,在页面的跳转前事件中,将该值同步至Session中,在页面的后台即LoadPage事件中,加载Session中存储的节点的选中状态并渲染至前端UI。

尝试方案一:

网上搜到的答案基本上都是首段描述的方案:history.back();location.reload(),。

在此处提出疑问:这种方式真的能奏效吗?我实现出来的结果是,刷新后的界面还是当前界面。错误猜想:假设存在3个页面,page1、page2、page3,现从page1点击后跳转至page2,此时点击"返回"按钮,返回上一页,按照以上的方案,history.back()后,url变为了page1的地址,页面加载到page1,但是location是为page2中的对象,所以导致在history.back()后调用location.reload()时,又刷新到了page2(此处为猜想,对内部逻辑不是很懂,若有错还请不吝指出,谢谢!)。

此处该方案Pass,个人感觉如上所述,该方案走不通,请各位解惑。

方案二:

还有一种方案,是通过location.referrer实现,从官方文档来看,这个属性可以获取到上一个访问的地址,可以实现返回的功能,
关于网页返回上一页并刷新的问题(C#、WebForm、移动端)
但是同样存在漏洞,依旧采用方案一举的例子进行假设:从page1点击后跳转至page2,再从page2点击跳转至page3,此时点击返回,返回至page2,当再次从page2点击跳转至page3时,问题就出现了。跳转之间location.referrer的值变化情况如下:

跳转前页面    跳转后页面    location.referrer值
    page1   -->   page2         page1.url
    page2   -->   page3         page2.url
    page3   -->   page2         page3.url
    page2   -->   page3         page2.url
    page3   -->   page2         page3.url

    ...

可以看出,从page3返回至page2之后再次进入page3,就会出现死循环。

所以方案二Pass。


综上所述,两种常见的方案均存在漏洞,在此不是指两种方案不正确,只是提出自己的一些疑问,如果有合理的解释或者我哪边用错了,还请各位能够指出,在此先谢过了~~~

下面贴一下自己的解决方案,见图即可:
关于网页返回上一页并刷新的问题(C#、WebForm、移动端)

相关文章:

  • 2022-12-23
  • 2021-08-25
  • 2021-10-16
  • 2022-02-10
  • 2021-12-05
  • 2021-12-05
  • 2022-12-23
猜你喜欢
  • 2021-12-05
  • 2021-12-05
  • 2022-12-23
  • 2021-12-05
  • 2021-12-05
  • 2022-01-07
  • 2022-12-23
相关资源
相似解决方案