我想检查何时有人尝试刷新页面。
例如,当我打开一个页面时,什么也没有发生,但是当我刷新页面时,它应该显示一个警报。
window.performance.navigation.type
已过时,请看我的回答。
我想检查何时有人尝试刷新页面。
例如,当我打开一个页面时,什么也没有发生,但是当我刷新页面时,它应该显示一个警报。
window.performance.navigation.type
已过时,请看我的回答。
Answers:
⚠️⚠️⚠️ window.performance.navigation.type
已过时,请参阅ИльяЗеленько的答案
知道页面实际已重新加载的更好方法是使用大多数现代浏览器支持的navigator对象。
//check for Navigation Timing API support
if (window.performance) {
console.info("window.performance works fine on this browser");
}
if (performance.navigation.type == 1) {
console.info( "This page is reloaded" );
} else {
console.info( "This page is not reloaded");
}
来源:https : //developer.mozilla.org/en-US/docs/Web/API/Navigation_timing_API
performance.navigation.type == performance.navigation.TYPE_RELOAD
更容易阅读,而不是== 1
。另外,如果你检查performance.navigation
你会发现,有4种不同势导航类型,如TYPE_BACK_FORWARD
,TYPE_NAVIGATE
window.performance.navigation.type
已过时,请参见我的回答。
第一步是检查sessionStorage
一些预定义的值,以及是否存在警报用户:
if (sessionStorage.getItem("is_reloaded")) alert('Reloaded!');
第二步是设置sessionStorage
一些值(例如true
):
sessionStorage.setItem("is_reloaded", true);
会话值会一直保持到页面关闭为止,因此只有在页面重新加载到网站的新标签页中时,会话值才有效。您也可以以相同的方式保持重载计数。
true
转换为"true"
。2)。会话存储将一直持续到用户关闭浏览器窗口为止,因此您无法分辨页面重新加载与同一浏览器会话中的站点导航之间的区别。
window.performance.navigation
Navigation Timing Level 2规范中已弃用该属性。请改用该界面。PerformanceNavigationTiming
这是一项实验技术。
检查浏览器兼容性表在生产环境中使用此功能之前,仔细。
type只读属性返回一个表示导航类型的字符串。该值必须是以下之一:
导航 —通过单击链接,在浏览器的地址栏中输入URL,提交表单或通过脚本操作(如下所示的reload和back_forward除外)来初始化导航。
reload —通过浏览器的reload操作或进行导航location.reload()
。
back_forward-导航通过浏览器的历史记录遍历操作。
prerender —导航由prerender提示启动。
此属性为只读。
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);
}
}
第一次访问该页面时存储cookie。刷新时,检查您的cookie是否存在,如果存在,则发出警报。
function checkFirstVisit() {
if(document.cookie.indexOf('mycookie')==-1) {
// cookie doesn't exist, create it now
document.cookie = 'mycookie=1';
}
else {
// not first visit, so alert
alert('You refreshed!');
}
}
并在您的身体标签中:
<body onload="checkFirstVisit()">
如果
event.currentTarget.performance.navigation.type
退货
0 =>用户刚刚输入网址
1 =>重新加载页面
2 =>单击了后退按钮。
performance.navigation.type
已弃用,请参见我的回答。
我在这里找到了一些信息Javascript Detection Page Refresh。他的第一个建议是使用隐藏字段,这些字段通常通过页面刷新进行存储。
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
属性进行检查,并根据该属性修改服务器响应
<script>
元素移到底部将可以工作-但是仍然不能保证解决方案(cookie方法也不是)。
Referer
也不可靠;许多代理和浏览器扩展程序将其从请求中删除。
我已经写了这个功能,使用旧的同时检查方法window.performance.navigation
和新的performance.getEntriesByType("navigation")
在同一时间:
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;
}
结果描述:
0:单击链接,在浏览器的地址栏中输入URL,提交表单,单击书签,通过脚本操作进行初始化。
1:单击“重新加载”按钮或使用Location.reload()
2:处理浏览历史记录(Bakc和Forward)。
3:预渲染活动<link rel="prerender" href="https://stackoverflow.com//example.com/next-page.html">
4:任何其他方法。
if(sessionStorage.reload) {
sessionStorage.reload = true;
// optionnal
setTimeout( () => { sessionStorage.setItem('reload', false) }, 2000);
} else {
sessionStorage.setItem('reload', false);
}