返回拦截

功能:从广告进入到落地页后,给history增加一个页面,拦截返回动作

主要用到的是h5中的history对象,使用了pushState,和replaceState来操作。

并且加入了一些条件判断,包括 history.state, history.state.page,history.state.entered。

以上这些方法可以实现按需操作history对象。

但history操作后,按返回按钮其实是只更新url地址,不刷新页面的,最终的刷新页面,是用 window.onpopstate 监听,

在判断条件符合后,手动去reload一次页面。

以下就是实现该功能的代码:

 /**
* @note 从广告渠道过来后,按返回按钮时的拦截功能
* @author kangxufeng <kangxufeng@duiba.com.cn>
* @create 17/08/08
* @des 1.url中存在a_tuiaId时,激活拦截功能
* 2.插入state:{page:'intercept'}的页面
* 3.当前页面state:{page:'current'}
*/ ;
(function() {
var intercetpUrl = '/'; $(function() {
if (history.pushState) {
// 支持pushState
if (!history.state) {
// 未插入页面
if (isToIntercept()) {
initReturn();
}
} else {
//已插入页面
window.onpopstate = function(e) {
if (history.state && history.state.page == 'current') {
location.reload();
} else if (history.state && history.state.page == 'intercept') {
if (!history.state.entered) {
// 未拦截
history.state.entered = true;
updateTimes(function() {
location.reload();
});
} else {
// 已拦截
history.go(-1);
}
}
}
}
} }) function initReturn() {
if (!history.state) {
var thisLocation = location.href;
history.replaceState({page:'intercept',entered:false},'',intercetpUrl);
history.pushState({page:'current'},'',thisLocation);
}
window.onpopstate = function () {
// location.reload();
if(history.state && history.state.page == 'intercept') {
if (!history.state.entered) {
// history.state.entered = true;
history.replaceState({page:'intercept',entered:true},'',intercetpUrl);
updateTimes(function() {
location.reload();
});
}
}
}
} function updateTimes(callback) {
callback & callback();
} function isToIntercept() {
if (getparams('a_tuiaId')) {
// 存在a_tuiaId,表示从广告进来
return true;
} else {
return false;
}
} function getparams(name) {
var regexS = "[\\?&]" + name + "=([^&#]*)";
var regex = new RegExp(regexS);
var results = regex.exec(location.href); if (results === null) return "";
else return results[1];
}
})(Zepto);

返回上上个页面

功能:首页打开商品详情页B,判断售罄跳转到售罄页C,在C页面点返回时略过B直接回到首页。

B.js:

jumpToEmpty: function() {
history.replaceState({page: 'soldout'}, '', '/item/soldOut');
location.reload();
}

C.js:

window.onpopstate = function() {
history.go(-1);
}

浏览器history操作实现一些功能的更多相关文章

  1. 详解Google Chrome浏览器(操作篇)(上)

    开篇概述 在上篇博客中详解Google Chrome浏览器(理论篇)一文中,主要讲解了Chrome 搜索引擎使用.Chrome安装和基本操作.Chrome 基本架构.多线程等原理性问题,这篇将重点讲解 ...

  2. splinter python浏览器自动化操作,模拟浏览器的行为

    Splinter可以非常棒的模拟浏览器的行为,Splinter提供了丰富的API,可以获取页面的信息判断当前的行为所产生的结果   最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有 ...

  3. 详解Google Chrome浏览器(操作篇)(下)

    开篇概述 由于最近忙于公司产品的架构与研发,已经三个多月没有写博客了,收到有些朋友的来信,问为什么不及时更新博客内容呢,他们说他们正期待着某些内容.对此,非常抱歉,那么我在此也给各位朋友一些承诺,从即 ...

  4. websocketj--随时随地在Web浏览器中操作你的服务端程序

    0 - 有没有觉得Linux标准终端界面输入输出枯燥无味? 1 - 什么?vmstat命令的输出数据不直观?有没有想过能够可视化该命令的输出? 2 - 尝试过用浏览器操作Windows中的cmd吗? ...

  5. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  6. H5手机移动端调起浏览器(qq浏览器,uc浏览器)自带分享功能实例

    H5手机移动端调起浏览器(qq浏览器,uc浏览器)自带分享功能实例 (转载:https://blog.csdn.net/weixin_38787928/article/details/86741227 ...

  7. es6 Object.assign ECMAScript 6 笔记(六) ECMAScript 6 笔记(一) react入门——慕课网笔记 jquery中动态新增的元素节点无法触发事件解决办法 响应式图像 弹窗细节 微信浏览器——返回操作 Float 的那些事 Flex布局 HTML5 data-* 自定义属性 参数传递的四种形式

    es6 Object.assign   目录 一.基本用法 二.用途 1. 为对象添加属性 2. 为对象添加方法 3. 克隆对象 4. 合并多个对象 5. 为属性指定默认值 三.浏览器支持 ES6 O ...

  8. 《数据结构与算法之美》 <06>栈:如何实现浏览器的前进和后退功能?

    浏览器的前进.后退功能,我想你肯定很熟悉吧? 当你依次访问完一串页面 a-b-c 之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面 b 和 a.当你后退到页面 a,点击前进按钮,就可以重新查看页 ...

  9. JQuery 阻止js事件冒泡 阻止浏览器默认操作

    //阻止事件冒泡 event.stopPropagation(); //阻止浏览器默认操作 event.preventDefault(); 代码不一定能执行,写给自己看的. 事件冒泡: <a h ...

随机推荐

  1. Java中enum的学习总结

    一.通常的定义常量的方法 public class Sex{ public final static int MALE = 1; public final static int FEMALE=2; } ...

  2. Winform开发框架中工作流模块之申请单草稿处理

    在我们开发工作流模块的时候,有时候填写申请单过程中,暂时不想提交审批,那么可以暂存为草稿,以供下次继续填写或者提交处理,那么这个草稿的功能是比较实用的,否则对于一些填写内容比较多的申请单,每次要重填写 ...

  3. 自学Python5.3-内置模块(1)

    内置模块(1)内置模块是Python自带的功能,在使用内置模块相应的功能时,需要  先导入 再 使用  1.OS模块       用于提供系统级别的操作: os.getcwd() 获取当前工作目录,即 ...

  4. sqlser 2005 对称加密,非对称加密笔记

    一:对称加密  原始明文---密钥---加密数据---密钥---原始明文 速度快,通过算法将明文混淆,占用系统资源少 二:非对称加密 加密解密速度慢,较高的系统资源占用 三:混合数据加密 加密过程:随 ...

  5. /etc/services保存了服务、端口、协议

  6. 【python】列表

    >>> mix = [2,3.4,"abc",'中国',True,['ab',23]]>>> mix[2, 3.4, 'abc', '中国', ...

  7. iOS知识点集合--更改(2)

    3.nsmutablearray *a 如果直接赋值 a = @[@"d",@""]; 这个时候a 是不可变的 字典也是如此 2.如果接口调用错误的话 打印re ...

  8. sharepreference使用教程

    1.应用 SharePreference主要用于保存一些数据,比如用户登录后的user_id,user_mobile,这样就可以做自动登录了,每次判断SharePreference中有没有数据,有的话 ...

  9. Ubuntu14.04下安装 boost (boost_1.54 最简单的方法)

    直接执行命令: sudo apt-get  install libboost-dev 测试: 创建一个 boost_test.cpp 文件,写入 #include<iostream> #i ...

  10. RabbitMQ之消费者Demo(队列参数详细说明)

    package com.jiefupay; import java.io.IOException; import java.util.HashMap; import java.util.Map; 8 ...