如何区分刷新(按F5/refresh按钮)和关闭浏览器?
How to distinguish between refresh (by F5/refresh button) and close browser?
我需要处理浏览器上的事件,例如在跨浏览器上返回、刷新和关闭。问题是我的客户希望每个事件都有不同的逻辑。
对于后退按钮,这个解决方案非常好:
但现在很难区分刷新和关闭,我找到的所有解决方案都是关于使用 "beforeunload" 事件:
- How to know whether refresh button or browser back button is clicked in firefox
- Handle refresh page event with javascript
- https://forums.asp.net/t/1829278.aspx?Detect+Browser+refresh+reload+button+click+in+all+browsers(这个不稳定)
- https://www.quora.com/What-is-the-best-way-to-detect-refresh-event-in-jquery
- https://www.sitepoint.com/community/t/detect-refresh-button-in-the-browser/1119/22
对于 F5 刷新,我可以捕获键盘上的事件,但是当用户按下浏览器上的刷新按钮时,我不能。如果我使用 "beforeunload",它与关闭浏览器事件相同。
我还找到了解决方法:
- Identifying Between Refresh And Close Browser Actions
- How do I detect a page refresh using jquery?
但不幸的是,我想做的是在页面卸载前显示消息(浏览器关闭时显示但刷新时不显示)
有谁知道解决方案(跨浏览器)
谢谢
您可能想要使用 Cookies/window.sessionStorage。
您可以设置没有明确到期日期的 cookie,以便它仅对当前会话可用(在用户关闭浏览器之前有效 window)。
您还可以使用 sessionStorage 对象,它只存储一个会话的数据。当用户关闭特定浏览器选项卡时,数据将被删除。
您可以遵循以下方法:
1.Create 用户首次访问页面时的 cookie document.cookie = "userloggedin=true";
或设置 sessionStorage.userLoggedIn = true;
2.Cookie 将在 refresh/closing 并重新打开选项卡后可用,如果 cookie 不存在则意味着用户关闭 window 并重新打开它。
类似地,sessionStorage 数据将在用户关闭浏览器选项卡后被删除
希望对您有所帮助!
tabOrBrowserStillAliveInterval;
constructor() {
// do some action if the browser or last opened tab was closed (in 15sec after closing)
if (this.wasBrowserOrTabClosed()) {
// do some action
}
// every 15sec update browserOrTabActiveTimestamp property with new timestamp
this.setBrowserOrTabActiveTimestamp(new Date());
this.tabOrBrowserStillAliveInterval = setInterval(() => {
this.setBrowserOrTabActiveTimestamp(new Date());
}, 15000);
}
setBrowserOrTabActiveTimestamp(timeStamp: Date) {
localStorage.setItem(
'browserOrTabActiveSessionTimestamp',
`${timeStamp.getTime()}`
);
}
wasBrowserOrTabClosed(): 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 秒超时后 - 将触发您期望的操作。
- 它适用于多个 windows 打开
- 服务器没有额外负载
- F5/刷新没问题
浏览器限制是我们在注销前需要 15 秒超时的原因。由于浏览器无法区分这样的情况:浏览器关闭、选项卡关闭和选项卡刷新。所有这些动作都被浏览器视为同一个动作。所以 15 秒超时就像一种解决方法,只捕获浏览器关闭或关闭所有打开的 你的应用程序 选项卡(并跳过 refresh/F5)。
我需要处理浏览器上的事件,例如在跨浏览器上返回、刷新和关闭。问题是我的客户希望每个事件都有不同的逻辑。 对于后退按钮,这个解决方案非常好:
但现在很难区分刷新和关闭,我找到的所有解决方案都是关于使用 "beforeunload" 事件:
- How to know whether refresh button or browser back button is clicked in firefox
- Handle refresh page event with javascript
- https://forums.asp.net/t/1829278.aspx?Detect+Browser+refresh+reload+button+click+in+all+browsers(这个不稳定)
- https://www.quora.com/What-is-the-best-way-to-detect-refresh-event-in-jquery
- https://www.sitepoint.com/community/t/detect-refresh-button-in-the-browser/1119/22
对于 F5 刷新,我可以捕获键盘上的事件,但是当用户按下浏览器上的刷新按钮时,我不能。如果我使用 "beforeunload",它与关闭浏览器事件相同。
我还找到了解决方法:
- Identifying Between Refresh And Close Browser Actions
- How do I detect a page refresh using jquery?
但不幸的是,我想做的是在页面卸载前显示消息(浏览器关闭时显示但刷新时不显示)
有谁知道解决方案(跨浏览器)
谢谢
您可能想要使用 Cookies/window.sessionStorage。
您可以设置没有明确到期日期的 cookie,以便它仅对当前会话可用(在用户关闭浏览器之前有效 window)。
您还可以使用 sessionStorage 对象,它只存储一个会话的数据。当用户关闭特定浏览器选项卡时,数据将被删除。
您可以遵循以下方法:
1.Create 用户首次访问页面时的 cookie document.cookie = "userloggedin=true";
或设置 sessionStorage.userLoggedIn = true;
2.Cookie 将在 refresh/closing 并重新打开选项卡后可用,如果 cookie 不存在则意味着用户关闭 window 并重新打开它。
类似地,sessionStorage 数据将在用户关闭浏览器选项卡后被删除
希望对您有所帮助!
tabOrBrowserStillAliveInterval;
constructor() {
// do some action if the browser or last opened tab was closed (in 15sec after closing)
if (this.wasBrowserOrTabClosed()) {
// do some action
}
// every 15sec update browserOrTabActiveTimestamp property with new timestamp
this.setBrowserOrTabActiveTimestamp(new Date());
this.tabOrBrowserStillAliveInterval = setInterval(() => {
this.setBrowserOrTabActiveTimestamp(new Date());
}, 15000);
}
setBrowserOrTabActiveTimestamp(timeStamp: Date) {
localStorage.setItem(
'browserOrTabActiveSessionTimestamp',
`${timeStamp.getTime()}`
);
}
wasBrowserOrTabClosed(): 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 秒超时后 - 将触发您期望的操作。
- 它适用于多个 windows 打开
- 服务器没有额外负载
- F5/刷新没问题
浏览器限制是我们在注销前需要 15 秒超时的原因。由于浏览器无法区分这样的情况:浏览器关闭、选项卡关闭和选项卡刷新。所有这些动作都被浏览器视为同一个动作。所以 15 秒超时就像一种解决方法,只捕获浏览器关闭或关闭所有打开的 你的应用程序 选项卡(并跳过 refresh/F5)。