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 相关文章推荐
Javascript中eval函数的使用方法与示例
Apr 09 Javascript
javascript实现的listview效果
Apr 28 Javascript
WEB高性能开发之疯狂的HTML压缩
Jun 19 Javascript
javascript学习笔记(九) js对象 设计模式
Jun 19 Javascript
js插件YprogressBar实现漂亮的进度条效果
Apr 20 Javascript
js实现的四级左侧网站分类菜单实例
May 06 Javascript
tab栏切换原理
Mar 22 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
Dec 27 Javascript
webpack本地开发环境无法用IP访问的解决方法
Mar 20 Javascript
前端js中的事件循环eventloop机制详解
May 15 Javascript
微信小程序从注册账号到上架(图文详解)
Jul 17 Javascript
Vue深入理解插槽slot的使用
Aug 05 Vue.js
基于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自动判断字符集并转码的详解
2013/06/26 PHP
JQuery Tips(2) 关于$()包装集你不知道的
2009/12/14 Javascript
Cookie 小记
2010/04/01 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
jquery中子元素和后代元素的区别示例介绍
2014/04/02 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
jQuery简单入门示例之用户校验demo示例
2016/07/09 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
Angular2 父子组件通信方式的示例
2018/01/29 Javascript
js实现适配移动端的拖动效果
2020/01/13 Javascript
[01:50]2014DOTA2西雅图邀请赛 专访欢乐周宝龙
2014/07/08 DOTA
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
python 制作网站小说下载器
2021/02/20 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
请介绍一下WSDL的文档结构
2013/03/17 面试题
党员年终民主评议的自我评价
2013/11/05 职场文书
事业单位请假制度
2014/01/13 职场文书
开会迟到检讨书
2014/02/03 职场文书
12月红领巾广播稿
2014/02/13 职场文书
公司租房协议书范本
2014/10/08 职场文书
2014年团队工作总结
2014/11/24 职场文书
幼儿园园长新年寄语2015
2014/12/08 职场文书
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android
Android中的Launch Mode详情
2022/06/05 Java/Android