На основе API возраста жизненного цикла Я создал этот класс:
const pageLifecycle = new class PageLifecycle extends EventTarget {
constructor() {
super();
this.state = this.getState();
const fn = () => this.stateChange(this.getState()),
opt = { capture: true },
events = {
pageshow: fn,
focus: fn,
blur: fn,
visibilitychange: fn,
resume: fn,
freeze: () => this.stateChange("frozen"),
pagehide: event => this.stateChange(event.persisted ? "frozen" : "terminated")
};
for (const [event, fn] of Object.entries(events)) window.addEventListener(event, fn, opt);
}
getState() {
return document.visibilityState === "hidden" ? "hidden" : document.hasFocus() ? "active" : "passive";
}
stateChange(nextState) {
if (nextState === this.state) return;
const prevState = this.state;
this.state = nextState;
this.dispatchEvent(Object.assign(new Event("stateChange"), { prevState, state: this.state }));
}
};
//--------
pageLifecycle.addEventListener("stateChange", event => console.log(`State change: ${event.prevState} >>> ${event.state}`));
Вы можете добавить к нему прослушиватель событий (событие: stateChange
), и вы получите один из ["active", "passive", "hidden", "frozen", "terminated"]
в event.state
. Проверьте на passive
и сохраните свои данные. Вы можете проверить event.prevState
, чтобы получить предыдущее состояние, чтобы определить, следует ли принудительно проверять сервер, чтобы убедиться, что пользователь все еще входит в систему.