壹 ❀ 引

登录成功后跳转到上一个页面是很常见的需求,比如在天猫添加购物车时网站会效验用户登录情况,若未登录则跳转登录,登录成功返回到先前的商品页。

这个功能实现并不困难,但因为我的奇思妙想让我先后了解了window.history对象以及窗口关闭/离开事件onbeforeunload,那么让这个需求做个引子,让我们开始一次有趣的探索之旅。

贰 ❀ 有趣的onbeforeunload

不管是从什么页面进入的登录页,总是得先有个离开页面的过程,那我在离开前一个页面时先记住页面,登录成功调回来不就好了,所以我第一就想到了onbeforeunload事件。

关于onbeforeunload事件,MDN上说的很详细,此事件在窗口即将被关闭(关闭浏览器 / 跳转到其它页面)时会触发,看个例子:

window.onbeforeunload = function () {
console.log('页面要离开了。');
};

复制此代码到浏览器控制台并回车执行,之后无论我们跳转或关闭窗口,你会发现console都会执行。

onbeforeunload事件的使用场景其实很多,比如博客园博离开未保存的博客编辑窗口,再如信息较多的表单填写等等,onbeforeunload主要起防止误操作丢失页面的作用,多一次挽回的机会。

值得一提的是onbeforeunload事件中无法使用window.open()以及window.alert()方法,若你使用,浏览器会抛出blocked xxxx during beforeunload类似的错误,意思就是在浏览器关闭前禁止使用弹窗或打开新窗口。

我们前面又说常用于离开页面给出友好弹窗提示,不能用alert怎么实现呢,得换一种方式,这里贴出代码:

window.onbeforeunload = function (e) {
var e = e || window.event,
dialogText = '页面还未保存,确定要离开吗?';
// 兼容IE8和Firefox 4之前的版本
if (e) {
e.returnValue = dialogText;
};
// Chrome, Safari, Firefox 4+, Opera 12+ , IE 9+
return dialogText;
};

当你运行这段代码并尝试关闭页面时,你会看到页面确实给出了如下提示:

但提示文字并没有使用我们自己定义语句,这是因为浏览器在之后的版本中已统一提示语句,自定义语句只在低版本浏览器适用。

onbeforeunload这么好用,兼容性怎么样呢,通过 can i use 一查,兼容性非常出色,完美兼容 IE6。

那么我有没有使用onbeforeunload来处理登录成功返回上个页面呢?很遗憾并没有,A页面跳B页面,B页面跳C页面,只要页面跳转此事件都会触发,页面跳转本身就属于高频操作,性能代价太大。

叁 ❀ 历史的掌控者history

我突然灵机一动!!!干嘛要自己去记录页面跳转呢,window.history不是已经帮我们做了这件事吗,想想还有点小激动。

打开浏览器控制台,输入window.history并回车,可以看到如下属性:

因为隐私问题,history对象早已不再展示用户浏览记录列表,只保留了go,back,forward以及HTML5新增的pushStatereplaceState方法用于操作页面记录。说通俗点,记录我不给你看,但允许你操作。

新增的两个方法我们先不说,这里主要说说前三个。我们来做个小实验,先打开百度,跳转到哔哩哔哩,再跳转到腾讯视频。现在打开控制台,输入window.history.back()并回车,你会发现页面从腾讯视频跳到了哔哩哔哩。按下方向键 ↑ 再回车,页面又回到了最初的百度。

现在输入window.history.forward()并回车,页面又会跳到B站,重复此操作,B站又跳到腾讯视频。

其实不难理解,假设已经建立了A-B-C三个节点,使用back就是从此节点往回退,相反的,forward就是从此节点往前进。

我们在腾讯视频页面输入window.history.go(-2),你会发现一下回到了百度,因为它等同于执行了2次back方法。对应的,输入window.history.go(2)回车,页面又能从百度回到腾讯,它等同于执行了2次forward方法,是不是很简单。

于是我就想到了这样的逻辑:

function login() {
//do something...
//返回上个页面
window.history.back();
};

于是某位用户将网站的登录页添加到了收藏夹,打开浏览器显示百度首页,点击收藏夹跳转登录页,登录成功后于是网站跳转百度,用户一脸懵逼....

很遗憾,history pass,不符合要求。

肆 ❀ 我的实现

使用onbeforeunload每个页面都会触发,性能不好,使用history我们是不用记录了,结果记录不受网站控制,网站外部也会记。那么我们就综合一下,需要记录的时候我们自己记。

一共也就两个地方需要记忆,我们知道登录一般都在页头,你想进入登录页必须点击登录按钮,那么这个时候记录就好了。

第二种情况就是程序跳转登录页,比如token过期自动跳转提示登录,那么在程序中需要跳转的地方也去记录。

因为登录属于全站性的操作,你也不知道用户在哪个页面进入的登录,所以像我这边使用angularjs开发的项目,就在总module上注册一个登录相关的service,这里只说具体方法实现:

//  在跳转登录前调用,用于记录当前页面
function localStorgeUrl() {
//取当前页面地址,这里模拟是百度
// let pathArr = window.location.pathname.split('/');
// let url = pathArr[pathArr.length - 1];
let url = 'http://www.baidu.com';
//本地存储该页面
window.localStorage.setItem('url', url);
}; function redirectUrl() {
//获取缓存路径
let url = window.localStorage.getItem('url');
//假设用户从外网进入登录页,取不到的情况跳转首页
url ? location.href = url : location.href = 'index.html';
}; //登录
function login() {
// 登录相关操作,假设登录成功
redirectUrl();
}; //跳转登录页前调用
localStorgeUrl();
//开始登录
login();

这里只是贴一个思路,如果有缘人看到有更好的做法,也欢迎讨论。本文从实现功能登录成功返回上个页面为引子,介绍了页面关闭事件onbeforeunload与history,也算一次不错的学习,那么就写到这里。

JS 页面离开事件 页面关闭事件,实现登录成功返回上个页面的更多相关文章

  1. Android - 页面返回上一页面的三种方式

    今年刚刚跳槽到了新公司,也开始转型做Android,由此开始Android的学习历程. 最近在解很多UI的bug,在解bug过程中,总结了在UI的实现过程中,页面返回上一页面的几种实现方式. 一. 自 ...

  2. Android 使用SwipeBackLayout实现滑动返回上一级页面——实战来袭

    我们知道.APP在设计上习惯性的把返回button放在屏幕的左上角,那么,在非常多时候(尤其是大屏幕手机),操作改返回button,就会有诸多不便了.为了更加方便实现"返回"功能. ...

  3. h5 网络断网时,返回上一个页面 demo (与检测网络代码相结合,更直观看到结果)

    页面一: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8& ...

  4. Javascript实现返回上一页面并刷新

    今天写了一个小小的提示成功的页面,同时要求返回上一页面,并实现对上一页面的操作进行刷新(例如删除的,添加的),在网上搜寻了一遍,基本上90%的都是说的是用window.history.go(-1), ...

  5. JavaScript返回上一页和返回上一级页面并刷新

    JavaScript返回上一页和刷新当前页 window.history.go(-1); //返回上一页 window.history.back(); //返回上一页 //如果要强行刷新的话就是:wi ...

  6. SpringSecurity兑现多登录成功页面和登录成功返回被拦截界面

    SpringSecurity实现多登录成功页面和登录成功返回被拦截界面 使用SrpingSceurity作为认证和授权的安全框架可以省下很多基础工作. 具体可以参考SpringSecurity,这里不 ...

  7. Flutter - 添加从左向右滑动,返回上一个页面

    很多App比如微信.IT之家等都支持从屏幕左侧向右滑动,来返回上一个页面. 很多iOS上的App也都支持. 那么这个神奇的手势滑动是怎么实现的呢? 其实非常简单,只需要添加一句话即可. platfor ...

  8. h5 返回上一页面方法

    //以下方法仅供参考1.返回上一页,不刷新history.html window.history.go(-1);  javascript:window.history.go(-1) 2.返回上一页并刷 ...

  9. js 页面之间的跳转、传参以及返回上一页

    js实现html 页面之间的跳转传参以及返回上一页的相关知识点 一.页面之间的跳转传参 1.在页面之间跳转的方式有两种: window.location.href="test.html?nu ...

  10. asp.net中的窗口弹出实现,包括分支窗口 . ASP.NET返回上一页面实现方法总结 .

    返回上一页的这个东东在我们做项目的时候一般是用于填写完表单后确认的时候,有对原来输入的数据进行修改或者更新时用的,或者是因为网站为了方便浏览者而有心添加的一个东东,一般这种功能的实现在ASP.NET中 ...

随机推荐

  1. [转帖]AF_UNIX和AF_INET

    https://www.cnblogs.com/shangerzhong/p/9153737.html family参数代表地址家族,比较常用的为AF_INET或AF_UNIX.AF_UNIX用于同一 ...

  2. [转帖]实战瓶颈定位-我的MySQL为什么压不上去–写场景

    https://plantegg.github.io/2023/06/30/%E5%AE%9E%E6%88%98%E7%93%B6%E9%A2%88%E5%AE%9A%E4%BD%8D-%E6%88% ...

  3. [转帖]调优"四剑客"的实战演练,福尔摩斯•K带你轻松优化性能

     前言 天下武功,唯快不破.在侦探的世界中,破案效率永远是衡量一名侦探能力的不二法门.作为推理界冉冉升起的新星,大侦探福尔摩斯·K凭借着冷静的头脑.严谨的思维,为我们展现了一场场华丽而热血的推理盛宴. ...

  4. [转帖]linux中Shell日期转为时间戳的方法

    http://www.nndssk.com/xtwt/169617hFPRvq.html shell中获取时间戳的方式为:date -d "$currentTime" +%s $ ...

  5. Python学习之二:不同数据库相同表是否相同的比较方法

    摘要 昨天学习了使用python进行数据库主键异常的查看. 当时想我们有跨数据库的数据同步场景. 对应的我可以对不同数据库的相同表的核心字段进行对比. 这样的话能够极大的提高工作效率. 我之前写过很长 ...

  6. [转帖]服务器稳定性测试-LTP压力测试方法及工具下载

    简介 LTP(LinuxTest Project)是SGI.IBM.OSDL和Bull合作的项目,目的是为开源社区提供一个测试套件,用来验证Linux系统可靠性.健壮性和稳定性.LTP测试套件是测试L ...

  7. JVM内存配置的再次思考

    JVM内存配置的再次思考 摘要 最近研究过不少内存分配相关的处理 今天晚上突然感觉还不是非常系统. 还是想能够细致的在学习一下. 希望能够慢慢的拾遗,提高自己 操作系统内存的使用情况 本文主要想思考l ...

  8. [转帖]计算机体系结构-重排序缓存ROB

    https://zhuanlan.zhihu.com/p/501631371 在现代处理器中,重排序缓存(Reorder Buffer,即ROB)是一个至关重要的概念,一个标准的乱序执行处理器在其多个 ...

  9. [转帖]C2C - False Sharing Detection in Linux Perf

    https://joemario.github.io/blog/2016/09/01/c2c-blog/ Do you run your application in a NUMA environme ...

  10. [转贴]win10临时修改、永久cmd 编码格式的方法

    https://www.jianshu.com/p/40a9fbaf1cac   cmd 前言 有时候,运行一些命令行程序某些字符无法正常显示,常见的就是方块,或者是火星文字都是由于 cmd 程序的默 ...