如何在JavaScript中获取上一个URL?

dzjeubhm  于 2023-03-16  发布在  Java
关注(0)|答案(9)|浏览(287)

有没有办法在JavaScript中获取之前的URL?类似于:

alert("previous url is: " + window.history.previous.href);

有这样的东西吗?或者我应该只把它存储在一个cookie中?我只需要知道,这样我就可以从以前的网址转换到当前的网址,而不需要锚等等。

hpcdzsge

hpcdzsge1#

document.referrer

在许多情况下,如果用户通过单击链接(而不是直接在地址栏中键入,或者我相信在某些情况下,通过提交表单?)到达当前页面,则会获得用户访问的最后一个页面的URL。
window.history允许导航,但出于安全和隐私原因,不允许访问会话中的URL。如果有更详细的URL历史记录,则您访问的每个站点都可以看到您访问过的所有其他站点。
如果您正在处理自己站点中的状态移动,那么使用一种常规会话管理技术可能会更安全,而且肯定会更有用:cookie数据、URL参数或服务器端会话信息。

nvbavucw

nvbavucw2#

如果你想在不知道网址的情况下进入上一页,你可以使用新的历史API。

history.back(); //Go to the previous page
history.forward(); //Go to the next page in the stack
history.go(index); //Where index could be 1, -1, 56, etc.

但是你不能在不支持API的浏览器上操作历史堆栈的内容
有关更多信息,请参见doc

5tmbdcev

5tmbdcev3#

如果您正在编写Web应用或单页应用(SPA),其中路由在应用/浏览器中进行,而不是到服务器的往返,则可以执行以下操作:

window.history.pushState({ prevUrl: window.location.href }, null, "/new/path/in/your/app")

然后,在新路由中,您可以执行以下操作来检索以前的URL:

window.history.state.prevUrl // your previous url
2mbi3lxu

2mbi3lxu4#

document.referrer并非在所有情况下都与实际URL相同。
我有一个应用程序,我需要建立一个有2个框架的框架集。一个框架是已知的,另一个是我链接的页面。看起来document.referrer是理想的,因为你不必将实际的文件名传递给框架集文档。
但是,如果您稍后更改底部框架页面,然后使用history.back(),它不会将原始页面加载到底部框架中,而是重新加载document.referrer,结果框架集消失,您返回到原始的开始窗口。
我花了一点时间来理解这一点。所以在历史数组中,document.referrer不仅仅是一个URL,它显然也是引用窗口规范。至少,这是我目前能够理解它的最好方式。

xu3bshqb

xu3bshqb5#

<script type="text/javascript">
    document.write(document.referrer);
</script>

document.referrer可以满足您的要求,但它不适用于IE9之前的Internet Explorer版本。
它将适用于其他流行的浏览器,如Chrome,Mozilla,Opera,Safari等。

irlmq6kh

irlmq6kh6#

如果有人来自React-world,我最终使用history-library、useEffect和localStorage的组合来解决我的用例
当用户选择新项目时:

function selectProject(customer_id: string, project_id: string){
    const projectUrl = `/customer/${customer_id}/project/${project_id}`
    localStorage.setItem("selected-project", projectUrl)
    history.push(projectUrl)
  }

当用户从另一个网站返回时,如果localStorage中有内容,请将其发送到该网站。

useEffect(() => {
    const projectUrl = localStorage.getItem("selected-project")
    if (projectUrl) {
      history.push(projectUrl)
    }
  }, [history])

用户退出项目时,清空localStorage

const selectProject = () => {
    localStorage.removeItem("selected-project")
    history.push("/")
  }
nsc4cvqm

nsc4cvqm7#

我在SPA单页应用程序上遇到了同样的问题,我解决这个问题的最简单方法是使用本地存储,如下所示:
我把需要的网址存储在本地存储器中

useEffect(() => {
const pathname = window.location.href; //this gives me current Url
localstorage.setItem('pageUrl',JSON.stringify(pathname))
}, []);

在下一个屏幕上(或几个屏幕后),我取得的网址可以取代它如下

useEffect(() => {
     const pathname = localstorage.getItem('pageUrl');
     return pathname ? JSON.parse(pathname) : ''
     window.location.href = pathname; //this takes prevUrl from local storage and sets it
}, []);
b0zn9rqh

b0zn9rqh8#

使用Node.js和Express的用户可以设置一个会话cookie来记住当前页面的URL,这样就可以在下一次页面加载时检查引用者。下面是一个使用express-session中间件的示例:

//Add me after the express-session middleware    
app.use((req, res, next) => {
    req.session.referrer = req.protocol + '://' + req.get('host') + req.originalUrl;
    next();
});

然后,您可以检查是否存在引用cookie,如下所示:

if ( req.session.referrer ) console.log(req.session.referrer);

不要假设引用cookie始终存在于此方法中,因为它在以前的URL是另一个网站、会话已清理或刚刚创建(首次加载网站)的情况下不可用。

brvekthn

brvekthn9#

即使document.referer为空也执行该工作的变通方法:

let previousUrl = null;

if(document.referrer){
  previousUrl = document.referrer;
  sessionStorage.setItem("isTrickApplied",false);

}else{
let isTrickApplied= sessionStorage.getItem("isTrickApplied");
if(isTrickApplied){
previousUrl = sessionStorage.getItem("prev");
sessionStorage.setItem("isTrickApplied",false);

}else{
history.back(); //Go to the previous page
sessionStorage.setItem("prev",window.location.href);
sessionStorage.setItem("isTrickApplied",true);
history.forward(); //Go to the next page in the stack
    }
}

相关问题