您的位置:首页 > 运维架构

popstate的自动触发问题

2017-02-14 20:58 99 查看
前段时间,因为项目需要,需要监听微信的返回按钮,于是用到了HTML5中的popstate,作为history系列中的事件,popstate在微信中存在这样一个问题:"当页面被加载的时候,popstate会立即被触发,从而导致页面返回到上一级页面"。而根据官方文档对popstate的描述只要访问历史记录就会触发popstate。而传统的History中访问页面和生产历史记录是同时的。在webkit(X5 blink)中,无论是刷新还是访问一个新网页都会触发popstate。

解决方案有两种:

方案一:

设置延迟时间:

function GoBack(e) {
this.init(e);
}
GoBack.prototype = {
constructor: GoBack,
init: function (url) {
this.pushHistory();
var bool = false;
setTimeout(function(){
bool = true;
},1000);
window.addEventListener("popstate", function() {
if(bool) {
//这里填写具体的动作
}
this.pushHistory();//出栈

}, false);
},
pushHistory: function () {
var state = {
title: "title",
url: "#"
};
window.history.pushState(state, "title", "#");
}
}
export default GoBack;

设置延迟的=有一个弊端,你要执行的具体动作要等延迟时间过了才可以,各种手机所需延迟时间长短不同,延迟设置的过低,会立即触发你要执行的动作,设置的过高,这段时间内你要执行的动作都不会被触发。(例如返回键失灵)。

方案二:

function GoBack(e) {
this.init(e);
}
GoBack.prototype = {
constructor: GoBack,
init: function (url) {
this.pushHistory();
window.addEventListener('load', function() {
setTimeout(function() {
window.addEventListener('popstate', function() {
//要执行的具体动作
});
}, 0);
})
},
pushHistory: function () {
var state = {
title: "title",
url: "#"
};
window.history.pushState(state, "title", "#");
}
}
export default GoBack;

第二种方案没有设置通过把页面加载完成后第一次触发的popstate事件屏蔽,来避免popstate马上执行。这中方案自己还没试过,貌似可行!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  popstate