I want to check when someone tries to refresh a page.
For example, when I open a page nothing happens but when I refresh the page it should display an alert.
I want to check when someone tries to refresh a page.
For example, when I open a page nothing happens but when I refresh the page it should display an alert.
⚠️⚠️⚠️ window.performance.navigation.type
is deprecated. Please see Илья Зеленько's answer.
A better way to know that the page is actually reloaded is to use the navigator object that is supported by most modern browsers.
It uses the Navigation Timing API.
//check for Navigation Timing API support
if (window.performance) {
console.info("window.performance works fine on this browser");
}
console.info(performance.navigation.type);
if (performance.navigation.type == performance.navigation.TYPE_RELOAD) {
console.info( "This page is reloaded" );
} else {
console.info( "This page is not reloaded");
}
Source: Navigation Timing API
performance.navigation.type
value of 1
. –
Androsterone performance.navigation.type == performance.navigation.TYPE_RELOAD
is easier to read instead of == 1
. Also, if you check performance.navigation
you will find that there are 4 diffrent navigation types like TYPE_BACK_FORWARD
,TYPE_NAVIGATE
–
Serenata window.performance.navigation
property is deprecated in the Navigation Timing Level 2 specification. Please use the PerformanceNavigationTiming
interface instead.
This is an experimental technology.
Check the Browser compatibility table carefully before using this in production.
const pageAccessedByReload = (
(window.performance.navigation && window.performance.navigation.type === 1) ||
window.performance
.getEntriesByType('navigation')
.map((nav) => nav.type)
.includes('reload')
);
alert(pageAccessedByReload);
The type read-only property returns a string representing the type of navigation. The value must be one of the following:
navigate — Navigation started by clicking a link, entering the URL in the browser's address bar, form submission, or initializing through a script operation other than reload and back_forward as listed below.
reload — Navigation is through the browser's reload operation or location.reload()
.
back_forward — Navigation is through the browser's history traversal operation.
prerender — Navigation is initiated by a prerender hint.
This property is Read only.
function print_nav_timing_data() {
// Use getEntriesByType() to just get the "navigation" events
var perfEntries = performance.getEntriesByType("navigation");
for (var i=0; i < perfEntries.length; i++) {
console.log("= Navigation entry[" + i + "]");
var p = perfEntries[i];
// dom Properties
console.log("DOM content loaded = " + (p.domContentLoadedEventEnd - p.domContentLoadedEventStart));
console.log("DOM complete = " + p.domComplete);
console.log("DOM interactive = " + p.interactive);
// document load and unload time
console.log("document load = " + (p.loadEventEnd - p.loadEventStart));
console.log("document unload = " + (p.unloadEventEnd - p.unloadEventStart));
// other properties
console.log("type = " + p.type);
console.log("redirectCount = " + p.redirectCount);
}
}
window.performance.getEntriesByType()
every time window.performance.navigation.type === 1
is false. Not sure if this is intended or not. –
Fortyniner getEntriesByType('navigation')
. What is your reason to use .map
instead of directly using the first entry. Is it possible to get multiple entries in some scenarios? I'm interested to know more about it. Please explain. –
Le The first step is to check sessionStorage
for some pre-defined value and if it exists, alert the user:
if (sessionStorage.getItem("is_reloaded")) alert('Reloaded!');
The second step is to set sessionStorage
to some value (for example true
):
sessionStorage.setItem("is_reloaded", true);
Session values kept until the page is closed, so it will work only if the page reloaded in a new tab with the site. You can also keep a reload count the same way.
true
is converted to "true"
. 2). Session storage persists until the user closes the browser window, so you can't tell the difference between page reload and navigating away from and back to you site within the same browser session. –
Johanajohanan Store a cookie the first time someone visits the page. On refresh check if your cookie exists and if it does, alert.
function checkFirstVisit() {
if(document.cookie.indexOf('mycookie')==-1) {
// The cookie doesn't exist. Create it now
document.cookie = 'mycookie=1';
}
else {
// Not the first visit, so alert
alert('You refreshed!');
}
}
And in your body tag:
<body onload="checkFirstVisit()">
document.cookies
is obsolete. It’s not obsolete; this suggested edit has been approved with one reject vote that says “It says that document.cookie
is obsoleted, but provides no documentation or link.” –
Serendipity I have written this function to check both methods using the old window.performance.navigation
and the new performance.getEntriesByType("navigation")
at the same time:
function navigationType(){
var result;
var p;
if (window.performance.navigation) {
result=window.performance.navigation;
if (result==255){result=4} // 4 is my invention!
}
if (window.performance.getEntriesByType("navigation")){
p=window.performance.getEntriesByType("navigation")[0].type;
if (p=='navigate'){result=0}
if (p=='reload'){result=1}
if (p=='back_forward'){result=2}
if (p=='prerender'){result=3} //3 is my invention!
}
return result;
}
Result description:
0: clicking a link, Entering the URL in the browser's address bar, form submission, Clicking bookmark, initializing through a script operation.
1: Clicking the Reload button or using Location.reload()
2: Working with browser history (Back and Forward).
3: prerendering activity like <link rel="prerender" href="//example.com/next-page.html">
4: any other method.
If
event.currentTarget.performance.navigation.type
returns
0 => the user just typed in an URL
1 => the page reloaded
2 => the back button is clicked.
performance.navigation.type
is deprecated, pls see my answer. –
Leucocyte I found some information in JavaScript Detecting Page Refresh. His first recommendation is using hidden fields, which tend to be stored through page refreshes.
function checkRefresh() {
if (document.refreshForm.visited.value == "") {
// This is a fresh page load
document.refreshForm.visited.value = "1";
// You may want to add code here special for
// fresh page loads
} else {
// This is a page refresh
// Insert code here representing what to do on
// a refresh
}
}
<html>
<body onLoad="JavaScript:checkRefresh();">
<form name="refreshForm">
<input type="hidden" name="visited" value="" />
</form>
</body>
</html>
Referer
property and modify server response on the basis of this property –
Erring <script>
element to the bottom would work - but it's still not a guaranteed solution (and neither is the cookie method). –
Lawson Referer
isn't reliable either; many proxies and browser extensions strip it from requests. –
Lawson Uncaught TypeError: Cannot read property 'visited' of undefined
. –
Aubreyaubrie Here is a method that is supported by nearly all browsers:
if (sessionStorage.getItem('reloaded') != null) {
console.log('page was reloaded');
} else {
console.log('page was not reloaded');
}
sessionStorage.setItem('reloaded', 'yes'); // could be anything
It uses SessionStorage to check if the page is opened the first time or if it is refreshed.
One easy solution has not been mentioned (not relying on the deprecated window.performance.navigation
):
Use window.onbeforeunload
to store the time and the URL of your current page (in localstorage) when the user leaves the page (potentially refreshes the page).
window.onbeforeunload = function(e)
{
localStorage.setItem('reload-url', window.location.href);
}
Then use window.onload
to get those values from localstorage.
window.onload = function(e)
{
if (localStorage.getItem('reload-url') != null))
{
if (window.location.href == localStorage.getItem('reload-url'))
{
console.log('Reload');
}
}
}
If the recent URL matches the stored URL and if the stored time matches the current time (maybe with a tiny offset) then it is a page reload by the user.
This implementation helped me:
From MDN reference 2022: Navigation Timing Level 2 specification
/** @var PerformanceNavigationTiming */
const navigationEntry = window.performance.getEntriesByType('navigation')[0];
const navigationType = navigationEntry.type;
const isPageReload = navigationType === 'reload';
const isNavigation = navigationType === 'navigate';
const isBackForwarad = navigationType === 'back_forward';
const isPrerender = navigationType === 'prerender';
In JavaScript (2023):
if (window.performance.getEntriesByType) {
if (window.performance.getEntriesByType("navigation")[0].type === "reload") {
alert("reloaded");
}
}
if(sessionStorage.reload) {
sessionStorage.reload = true;
// optionnal
setTimeout( () => { sessionStorage.setItem('reload', false) }, 2000);
} else {
sessionStorage.setItem('reload', false);
}
Append the below script in the console:
window.addEventListener("beforeunload", function(event) {
console.log("The page is redirecting")
debugger;
});
load
will do a quick check if page is reloaded or not –
Marsden <script>
var currpage = window.location.href;
var lasturl = sessionStorage.getItem("last_url");
if(lasturl == null || lasturl.length === 0 || currpage !== lasturl ){
sessionStorage.setItem("last_url", currpage);
alert("New page loaded");
}else{
alert("Refreshed Page");
}
</script>
document.addEventListener("keydown", (e)=>{
if (e.keyCode === 116) {
e.preventDefault();
// your code here
// var r = confirm("Reload!");
// if (r == true)
// window.location.reload();
}
})
© 2022 - 2024 — McMap. All rights reserved.