项目中一个页面需要实现点击链接跳转之后,再返回上一页,能够定位到曾经点击的位置,在商城首页、产品列表页、文章列表页等经常会有这样的场景。所以把这类需求的实现方式大概研究了一下。目前想到的思路有以下几个:
1)使用浏览器历史记录history进行定位
a. 点击的时候记录点击的元素,记录到history的location.hash,当浏览器回退上一页的时候解析location.hash,定位到该元素
借用网上的一段代码,展示一下思路,实际自己用的时候是需要对应的修改的
//定位,主要是初始化第几个tab,适用于有二级内容的场景
function initPos() {
var hashs = location.hash.slice(1).split('&');
hashs = hashs.map(function(hash){ //url解码
return decodeURIComponent(hash)
})
if(parseInt(hashs[0])>=0&&parseInt(hashs[0])<100){
navHash = parseInt(hashs[0]) //第几个tab
contentHash = hashs[1] //tab下的具体模块id
}
var $root=$('ul');
if(navHash && $root.find('li')[navHash].length){
$root.find('li')[navHash].addClass('cur');
}else{
$root.find('li')[0].addClass('cur');
}
loadTabContent(tabIndex,initContent);//加载对应tab下面的内容
}
注意,如果tab下的内容是后来加载的,可能会出现,解析到url后。在页面上,由于加载时间的关系,没有找到对应的tab下面具体模块的id。这时候会定位不成功。所以还需要在加载好数据之后,再保证一下。
|
b.点击的时候记录当前窗口滚动的距离,记录到history的location.hash,当浏览器回退上一页的时候解析location.hash,滚动到对应距离
//绑定点击事件
$('[data-link]').on('click',function(event) {
//阻止默认跳转行为,阻止冒泡
event.preventDefault();
event.stopPropagation();
history.replaceState('', document.title, location.href.replace(location.hash, "") + "#nowTop=" + $(window).scrollTop());
window.location.href=$(this).attr('data-link');
});
//页面回退显示时的判断
if ($('body').height() > nowTop) {
window.scrollTo(0, nowTop);
}
2)使用ajax实现不刷新的“假”跳转
a. 利用ajax实现,原来的页面作为一个div,点击链接隐藏原来的div展示新的div,关闭新div显示原来的div;当然打开的新div是需要使用ajax或者类似方式进行数据绑定的
b. 利用VUE等框架做单页面的应用也能实现效果,对此了解不多,大概原理应该类似
3)我们项目中的场景,由于页面上面的元素都是绝对定位出来的,父元素都没有高度,无法获取window的滚动距离,所以无法使用滚动距离的方式(这种方式是体验比较好的)
所以,只能对元素进行定位,好的是,项目的前端页面写的还是比较规范的,只需要对页面中所有的a标签进行对应的处理就可以;写在这里以留备忘:
//点击a标签链接时
$('a').on('click',function(event) {
//阻止默认跳转行为,阻止冒泡
event.preventDefault();
event.stopPropagation();
//如果是空链接则return
if($(this).attr('href')=='#'){
return;
}
// 获取当前元素的a顺序位置
var aindex = $(this).index('a');
//操作保存浏览器的历史记录
history.replaceState('', document.title, location.href.replace(location.hash, "") + "#" + aindex);
//跳转新页面
window.location.href=$(this).attr('href');
});
//页面回退时
if(location.hash!=''){
var as = document.getElementsByTagName('a');
var aindex = location.hash.substr(1);
as[aindex].setAttribute('name',"index"+aindex);
location.hash = "#index"+aindex;
}