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 相关文章推荐
jquery一句话全选/取消全选
Mar 01 Javascript
JavaScript全局函数使用简单说明
Mar 11 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
Dec 17 Javascript
JavaScript自动设置IFrame高度的小例子
Jun 08 Javascript
javascript文件中引用依赖的js文件的方法
Mar 17 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
Oct 30 Javascript
第一次接触JS require.js模块化工具
Apr 17 Javascript
JS取数字小数点后两位或n位的简单方法
Oct 24 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
May 08 Javascript
JavaScript使用readAsDataUrl方法预览图片
May 10 Javascript
详解Vue文档中几个易忽视部分的剖析
Mar 24 Javascript
vue 授权获取微信openId操作
Nov 13 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
JavaScript中的数组特性介绍
2014/12/30 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
js实时获取并显示当前时间的方法
2015/07/31 Javascript
js表单提交和submit提交的区别实例分析
2015/12/10 Javascript
jQuery中判断对象是否存在的方法汇总
2016/02/24 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
vue.js层叠轮播效果的实例代码
2018/11/08 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
python中的随机函数小结
2018/01/27 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
UGG英国官方网站:UGG UK
2018/02/08 全球购物
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
乌克兰电子和家用电器商店:Foxtrot
2019/07/23 全球购物
机械设计制造专业个人求职信
2013/09/25 职场文书
外企财务年会演讲稿
2014/01/03 职场文书
军人违纪检讨书
2014/02/04 职场文书
入学申请自荐信范文
2014/02/26 职场文书
车间机修工岗位职责
2014/02/28 职场文书
大学校务公开实施方案
2014/03/31 职场文书
读书小明星事迹材料
2014/05/03 职场文书
团组织推荐意见
2015/06/05 职场文书
Python上下文管理器Content Manager
2021/06/26 Python