移动上的Safari浏览器返回按钮,不返回用户到上一页上滚动的位置

我能够找到一个暂时的解决方案,但我仍然认为它可以改进。

解释:

使用递归函数和本地存储,我能够跟踪并不断更新滚动位置。单击外部链接时,将保存滚动位置,并在本地存储中将“标志变量”设置为0。

当用户通过browser back按钮返回时,递归函数开始不断地将滚动位置更新为保存在本地存储中的变量。然后,一旦用户拖动屏幕,“标志变量”将更改为1,该函数将停止更新滚动位置,以便用户可以自由拖动。

代码:

代码语言:javascript运行复制// check if browser is Safari

window.is_safari = true;

$(document).ready(function(){

window.is_safari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);

});

// when external link is clicked store scroll position and flag to localStorage

$('.external-link').on('click', function() {

// save scroll position to local storage

window.localStorage.setItem("scroll", $(document).scrollTop());

// check the size of window (most likely on touch screen if below this size)

if($(window).width() <= 1000)

{

// save flag variable to local storage

window.localStorage.setItem("returnPos", 0);

}

});

function repeatFunction(){

if(window.localStorage.getItem('returnPos') == 0)

{

// keep the scroll position the same as localStorage variable

$(document).scrollTop( window.localStorage.getItem('scroll') );

// once user drags change flag to one so this if statement doesn't get entered

// and scroll position can move freely

$(document).on('mousedown touchstart', function()

{

window.localStorage.setItem("returnPos", 1);

});

}

// if Safari keep calling function

if(window.is_safari){

setTimeout(repeatFunction, 100);

}

}

$(document).ready(function(){

repeatFunction();

});潜在问题:

我想您的网站可能会开始运行较慢,因为这个递归函数正在被使用。不幸的是,我无法让$(window).on('popstate', function(event) {});在Safari上启动,因此我不知道如何检测页面是否通过back按钮重新加载。

此外,如果用户使用的触摸屏大于if语句中检查的值,则此方法将无法工作。如果用户使用的桌面屏幕小于if语句中选中的值,则在通过Safari browser back按钮返回页面时,他们必须先单击才能滚动到页面。

Top