js模拟网页的回退回退

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/eadio/article/details/70331970

        在开发混合项目的过程有个需求是h5自定义页面的回退功能,等到无法回退的时候,直接关闭h5网页直接返回app界面。查找了很多资料都说无法实现,要不就是检测history.length来判断,但是我实际操作发现,回退的时候history.length并不会自动减少。最后自己分析了下回退的模式,使用sessionStorage实现的。大致如下:


        我从app跳转到a页面,在从a页面跳转到b页面,然后b点击回退a,在从a点击回退,这时候直接关闭a页面,回退到app。分析得到

        1、当我跳转浏览不同页面的时候就会记录一个浏览历史地址

        2、当我在从当前b页面点击回退的a页面的时候,我从浏览历史地址中把这个记录移除掉,为了防止多次点击触发删除历史记录,我们需要做个处理,将当前页面地址和浏览的历史地址最后一个记录匹配,成功了才可以进行回退


        演示效果如下:【备注:浏览器演示,回退到不能回退了,我直接关闭网页】


        下面是源码:

(function(win){
	var TabBarPlug=function(options){
		this.barTitle='DEMOBAR';
	}
	TabBarPlug.prototype={
		//获取浏览过的地址
		getSessionUrl: function(){
			return JSON.parse(sessionStorage.getItem('historyUrl') || '[]');
		},
		//存储浏览历史地址
		setSessionUrl: function (source) {
			sessionStorage.setItem('historyUrl', JSON.stringify(source || []));
			return true;
		},
		//测试
		setBarTitle: function(pageUrl){
			pageUrl=pageUrl.toLowerCase();
			if(pageUrl.indexOf('a.html')>-1){
				this.barTitle='DEMOA';
			}
			if(pageUrl.indexOf('b.html')>-1){
				this.barTitle='DEMOB';
			}
		},
		//当前页面和浏览历史最后一条匹配
		isCurPage: function (urls) {
			var curUrl = location.href;
			if (!urls) {
				urls = [];
			}
			var lastUrl = urls[urls.length - 1];
			if (lastUrl == curUrl) {
				return true;
			} else {
				return false;
			}
		},
		init: function(){
			var historyUrl = this.getSessionUrl();
			var curUrl = location.href;
			this.setBarTitle(curUrl);
			//因为当执行history.back后,当前页面会在刷新一次,这时候是不需要加入浏览记录的
			if (!this.isCurPage(historyUrl)) {
				historyUrl.push(curUrl);
				this.setSessionUrl(historyUrl);//存储浏览记录
			}
		},
		go: function (e) {
			e ? e : window.event;
			e.preventDefault();
			e.stopPropagation();
			var historyUrl = this.getSessionUrl();
			var that = this;
			var backApp = function () {
				sessionStorage.removeItem('historyUrl');//移除session
				win.close();
			};
			var back = function () {
				//IE history.length=0 其他:fixfox、gg history.length=1
				if (that.isCurPage(historyUrl)) {//防止用户多次点击
				  historyUrl.pop();//删除浏览地址
				  that.setSessionUrl(historyUrl);//存储浏览记录
				  //发现在app内嵌的页面需要延迟执行,否则会出现连续关闭两个页面的情况
				  setTimeout(function () {
				    history.back();//回退
				  }, 500);
				  //回退app
				  if (historyUrl.length <= 0) {
				    backApp();
				  }
				} 
			};
			console.log(historyUrl);
			back();
		}
	}
	win.TabBarPlug=new TabBarPlug();
})(window);	

//使用方法如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
		<title>a</title>
		<style type="text/css">
			*{ margin:0; padding:0; }
			body{ height: 100%; font-size: 14px; color:#fff; background: #222; }
			#back{ font-size: 20px; color: red; }
			
		</style>
	</head>
	<body>
		
		<div class="box">
			lldsjfls<br>
			lsdjfls<br>
			<a href="b.html">跳转b页面</a>
			lsdjfls<br>
			lsdjfls<br>
			<div id="back"> click me to back</div>
		</div>
		<script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
		<script src="js/tabBar.js"></script>
		<script type="text/javascript">
			TabBarPlug.init();//每个页面需要加入这个初始化记录浏览地址
			document.getElementById('back').addEventListener('click', function(e){
			    TabBarPlug.go(e);//执行回退
			});
		</script>

	</body>
</html>


猜你喜欢

转载自blog.csdn.net/eadio/article/details/70331970