js中document.referrer实现移动端返回上一页


Posted in Javascript onFebruary 22, 2017

返回上一页,在PC端我们可以使用:history.go(-1)或者history.back(),可以正常返回第一层。这样,我们不需要上一页的 url 具体是什么,只要使用 history 一般都没啥问题。

但是在移动端,如果想要返回上一页。比如从A页面跳到B页面,如果B页面想返回A页面,为了防止不会跳错,必须要有一个 <  按钮,给它加 history.go(-1) ,返回上一层。

<a href="javascript:history.go(-1)" rel="external nofollow" class="header-back jsBack">返回</a>

那如果我们没有返回上一页的 < 的按钮,在手机上怎么操作才会返回上一页,比如:从微信分享进来的,进入的是微信内页,此时,内页就是第一页,它没有上一页,要怎么返回?这时点返回按钮是没有反应的,不是一个好的用户体验,十有八九的人会误以为是BUG,这绝对是个坑爸的问题。

移动端无论是原生app还是传统的网页,返回上页是一个比较强烈的需求。

javascript 有一个可以获取前一页面的URL地址的方法:document.referrer

document.referrer 的来源

  1. referrer 属性可返回载入当前文档的文档的 URL【摘自W3CSHCOOL】, 如果当前文档不是通过超链接访问的,那么当前文档的URL为NULL,这个属性允许客户端的 javascript 访问 HTTP 头部;
  2. referrer 属性,我们可以从 http 头部获取

document.referrer 的兼容性

document.referrer IE7都支持,它的兼容性比较高,Android 5.0开始支持,iOS都支持,PC端浏览器从IE7就开始支持了,兼容性没有什么大的问题。

但是有个小小的问题,就是 IE 会主动清除 referref 属性。在IE中用javascript做跳转,比如用window.location.href = “”; google如果使用document.referrer无法取到浏览器请求的HTTP referrer,因为IE清空了。而其他主流浏览器Firefox和Chrome都会保留referrer,没办法,只好判断,如果是IE浏览器,就主动给它增加一个 referrer 。这样的原理就是给IE浏览器的页面偷偷加了个链接,然后自动点这个链接,于是referrer就能保留了。

var url = 'https://3water.com'; 
if (/MSIE (\d+\.\d+);/.test(navigator.userAgent) || /MSIE(\d+\.\d+);/.test(navigator.userAgent)) 
{ 
 var referLink = document.createElement('a'); 
 referLink.href = url; 
 document.body.appendChild(referLink); 
 referLink.click(); 
} 
else 
{ 
 location.href = url; 
}

document.referrer 的牛X做法

解决移动端返回上一页的问题,就是上面所说的微信分享的问题?根据【张鑫旭】大神的方法是,既然点击上一页没有反应,就让它返回首页,从首页再进入其它子页面,应该没啥问题。

1.根据 document.referrer 的来源来判断是否有来源信息,如果没有,则返回首页:

if (typeof document.referrer === '') {
 // 没有来源页面信息的时候,改成首页URL地址
 $('.jsBack').attr('href', '/');
}

这样,当再次点击返回按钮时,就可以返回首页了。

2.根据 document.referrer 的来源url 是否为网站的 url,如果判断这个 url 的来路有问题,则屏蔽该 url 下的所有信息,比如不让其显示图片等。可以有效的防止盗链,目前百度统计,google ads统计,CNZZ统计,都是用的这个方法。

无法获取 referrer 信息的情况

下面的场景无法获得 referrer 信息,以下前8条属于【张鑫旭】:

  1. 直接在浏览器中输入地址
  2. 使用location.reload()刷新(location.href或者location.replace()刷新有信息)
  3. 在微信对话框中,点击进入微信自身浏览器
  4. 扫码进入微信或QQ的浏览器
  5. 直接新窗口打开一个页面
  6. 从https的网站直接进入一个http协议的网站(Chrome下亲测)
  7. a标签设置rel="noreferrer"(兼容IE7+)
  8. meta标签来控制不让浏览器发送referer
  9. 点击 flash 内部链接
  10. Chrome4.0以下,IE 5.5+以下返回空的字符串
  11. 使用 修改 Location 进行页面导航的方法,会导致在IE下丢失 referrer,这可能是IE的一个BUG
  12. 跨域

<meta content="never" name="referrer">

怎么解决无法获取 referrer 的情况,还没有很好的方法,尽量避免吧。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
一个很酷的拖动层的js类,兼容IE及Firefox
Jun 23 Javascript
url 编码 js url传参中文乱码解决方案
Apr 11 Javascript
JavaScript 验证码的实例代码(附效果图)
Mar 22 Javascript
JavaScript实现表格排序方法
Jun 14 Javascript
js中的setInterval和setTimeout使用实例
May 09 Javascript
angularjs实现与服务器交互分享
Jun 24 Javascript
JavaScript中对象property的删除方法介绍
Dec 30 Javascript
JavaScript实现图片自动加载的瀑布流效果
Apr 11 Javascript
vue.js入门教程之基础语法小结
Sep 01 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
Jun 06 Javascript
vue插槽slot的简单理解与用法实例分析
Mar 14 Javascript
flexible.js实现移动端rem适配方案
Apr 07 Javascript
基于JS实现bookstore静态页面的实例代码
Feb 22 #Javascript
angular 动态组件类型详解(四种组件类型)
Feb 22 #Javascript
javascript 使用正则test( )第一次是 true,第二次是false
Feb 22 #Javascript
JavaScript实现256色转灰度图
Feb 22 #Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
Feb 22 #Javascript
微信小程序 扎金花简单实例
Feb 21 #Javascript
angular中的http拦截器Interceptors的实现
Feb 21 #Javascript
You might like
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
2008/09/10 PHP
php explode函数实例代码
2012/02/27 PHP
深入PHP数据加密详解
2013/06/18 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
php截取字符串函数分享
2015/02/02 PHP
一个非常完美的读写ini格式的PHP配置类分享
2015/02/12 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
php实现简易计算器
2020/08/28 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
JS+canvas绘制的动态机械表动画效果
2017/09/12 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
完美解决linux下node.js全局模块找不到的情况
2018/05/16 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
Python中的各种装饰器详解
2015/04/11 Python
Python中static相关知识小结
2018/01/02 Python
Python生成器定义与简单用法实例分析
2018/04/30 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
Python中的Numpy矩阵操作
2018/08/12 Python
Python多线程原理与用法详解
2018/08/20 Python
Django CBV类的用法详解
2019/07/26 Python
python解析yaml文件过程详解
2019/08/30 Python
canvas烟花特效锦集
2018/01/17 HTML / CSS
联想台湾官网:Lenovo TW
2018/05/09 全球购物
Shop Apotheke瑞士:您的健康与美容网上商店
2019/10/09 全球购物
建筑工程专业学生的自我评价
2013/12/25 职场文书
答谢会策划方案
2014/05/12 职场文书
个人安全生产承诺书
2014/05/22 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
Vue如何清空对象
2022/03/03 Vue.js