我希望在用户关闭浏览器时注销其账户。为此,我进行了一些研究并发现以下代码将在我们关闭浏览器时触发。
window.onbeforeunload = function() {
myService.logout();
return 'Your own message goes here...';
}
当我尝试关闭浏览器时,此事件将触发并使用户注销。但问题是当页面被重定向时,此事件也会触发。
我想使用此功能使用户注销。但是目前出现了问题,请帮助我实现此功能。
我希望在用户关闭浏览器时注销其账户。为此,我进行了一些研究并发现以下代码将在我们关闭浏览器时触发。
window.onbeforeunload = function() {
myService.logout();
return 'Your own message goes here...';
}
当我尝试关闭浏览器时,此事件将触发并使用户注销。但问题是当页面被重定向时,此事件也会触发。
我想使用此功能使用户注销。但是目前出现了问题,请帮助我实现此功能。
但是问题在于当页面被重定向时,这个事件也会触发。
我猜测这是你自己执行的重定向。如果是这样的话,为什么不使用全局变量来区分你的重定向和客户端的重定向呢?像这样:
...
thisismyredirect = true; //before redirecting, set this variable
window.location = "http://www.yoururl.com";
...
在你的onbeforeunload
事件中,你需要检查这个重定向是否是由你执行的。如果是,那么就不需要调用logout()
函数:
window.onbeforeunload = function() {
if(!thisismyredirect) {
myService.logout();
return 'Your own message goes here...';
}
}
tabOrBrowserStillAliveInterval;
constructor() {
// system should logout if the browser or last opened tab was closed (in 15sec after closing)
if (this.wasBrowserOrTabClosedAfterSignin()) {
this.logOut();
}
// every 15sec update browserOrTabActiveTimestamp property with new timestamp
this.setBrowserOrTabActiveTimestamp(new Date());
this.tabOrBrowserStillAliveInterval = setInterval(() => {
this.setBrowserOrTabActiveTimestamp(new Date());
}, 15000);
}
signin() {
// ...
this.setBrowserOrTabActiveTimestamp(new Date());
}
setBrowserOrTabActiveTimestamp(timeStamp: Date) {
localStorage.setItem(
'browserOrTabActiveSessionTimestamp',
`${timeStamp.getTime()}`
);
}
wasBrowserOrTabClosedAfterSignin(): boolean {
const value = localStorage.getItem('browserOrTabActiveSessionTimestamp');
const lastTrackedTimeStampWhenAppWasAlive = value
? new Date(Number(value))
: null;
const currentTimestamp = new Date();
const differenceInSec = moment(currentTimestamp).diff(
moment(lastTrackedTimeStampWhenAppWasAlive),
'seconds'
);
// if difference between current timestamp and last tracked timestamp when app was alive
// is more than 15sec (if user close browser or all opened *your app* tabs more than 15sec ago)
return !!lastTrackedTimeStampWhenAppWasAlive && differenceInSec > 15;
}
工作原理: 如果用户关闭浏览器或关闭所有打开的您的应用程序选项卡,则在15秒超时后将触发注销。
浏览器限制是我们需要15秒超时注销的原因。由于浏览器无法区分这些情况:浏览器关闭、选项卡关闭和选项卡刷新。浏览器将所有这些操作视为相同的操作。因此,15秒超时就像一个解决方法,只捕获浏览器关闭或关闭所有打开的您的应用程序选项卡(并跳过刷新/F5)。
$rootScope
中的$destroy
事件。 - Koushik Chatterjee