ฉันต้องการตรวจสอบเมื่อมีคนพยายามรีเฟรชหน้า
ตัวอย่างเช่นเมื่อฉันเปิดหน้าไม่มีอะไรเกิดขึ้น แต่เมื่อฉันรีเฟรชหน้ามันควรจะแสดงการแจ้งเตือน
ฉันต้องการตรวจสอบเมื่อมีคนพยายามรีเฟรชหน้า
ตัวอย่างเช่นเมื่อฉันเปิดหน้าไม่มีอะไรเกิดขึ้น แต่เมื่อฉันรีเฟรชหน้ามันควรจะแสดงการแจ้งเตือน
คำตอบ:
⚠️⚠️⚠️ window.performance.navigation.type
เลิกใช้แล้วโปรดดูคำตอบของИльяЗеленько
วิธีที่ดีกว่าที่จะทราบว่าเพจนั้นถูกโหลดใหม่จริงๆคือการใช้วัตถุนำทางที่ได้รับการสนับสนุนโดยเบราว์เซอร์ที่ทันสมัยที่สุด
จะใช้ระยะเวลา API
//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
ขั้นแรกคือการตรวจสอบsessionStorage
ค่าที่กำหนดไว้ล่วงหน้าและหากมีผู้ใช้แจ้งเตือนอยู่:
if (sessionStorage.getItem("is_reloaded")) alert('Reloaded!');
ขั้นตอนที่สองคือตั้งค่าsessionStorage
เป็นบางค่า (ตัวอย่างtrue
):
sessionStorage.setItem("is_reloaded", true);
ค่าเซสชันถูกเก็บไว้จนกว่าจะปิดหน้าดังนั้นมันจะทำงานเฉพาะเมื่อหน้าโหลดซ้ำในแท็บใหม่กับไซต์ คุณยังสามารถนับจำนวนการโหลดซ้ำได้เช่นเดียวกัน
true
"true"
2) ที่จัดเก็บเซสชันยังคงอยู่จนกว่าผู้ใช้จะปิดหน้าต่างเบราว์เซอร์ดังนั้นคุณจึงไม่สามารถบอกความแตกต่างระหว่างการโหลดหน้าซ้ำและการนำทางออกจากและกลับไปยังไซต์ของคุณภายในเซสชันเบราว์เซอร์เดียวกัน
window.performance.navigation
คุณสมบัติเลิกใช้แล้วในข้อมูลจำเพาะการนำทางระดับที่ 2 กรุณาใช้PerformanceNavigationTiming
ส่วนต่อประสานแทน
นี่คือเทคโนโลยีทดลองเทคโนโลยีการทดลอง
ตรวจสอบตารางความเข้ากันได้ของเบราว์เซอร์อย่างรอบคอบก่อนที่จะใช้สิ่งนี้ในการผลิต
คุณสมบัติ type read-only จะส่งคืนสตริงที่แทนชนิดของการนำทาง ค่าต้องเป็นอย่างใดอย่างหนึ่งต่อไปนี้:
การนำทาง - การนำทางเริ่มต้นโดยการคลิกที่ลิงค์ป้อน URL ในแถบที่อยู่ของเบราว์เซอร์การส่งแบบฟอร์มหรือการเริ่มต้นผ่านการดำเนินการของสคริปต์นอกเหนือจากการโหลดซ้ำและย้อนกลับไปข้างหน้าตามที่แสดงด้านล่าง
โหลด - 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);
}
}
จัดเก็บคุกกี้ในครั้งแรกที่มีคนเยี่ยมชมหน้าเว็บ ในการรีเฟรชตรวจสอบว่ามีคุกกี้ของคุณอยู่หรือไม่
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 => ผู้ใช้เพิ่งพิมพ์ Url
1 => โหลดหน้าซ้ำ
2 => ปุ่มย้อนกลับคลิก
ผมพบว่าข้อมูลบางอย่างที่นี่Javascript ตรวจจับหน้ารีเฟรช คำแนะนำแรกของเขาคือการใช้เขตข้อมูลที่ซ่อนอยู่ซึ่งมีแนวโน้มที่จะถูกเก็บไว้ผ่านการรีเฟรชหน้า
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>
องค์ประกอบไปที่ด้านล่างจะใช้งานได้ - แต่ก็ยังไม่ใช่โซลูชันที่รับประกันได้ (และไม่ใช่วิธีคุกกี้)
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 and Forward)
3:กิจกรรมแสดงผลล่วงหน้าเช่น<link rel="prerender" href="https://stackoverflow.com//example.com/next-page.html">
4:วิธีอื่นใด
ฉันพบข้อมูลบางอย่างที่นี่ Javascript Detecting Page Refresh
function UnLoadWindow() {
return 'We strongly recommends NOT closing this window yet.'
}
window.onbeforeunload = UnLoadWindow;
if(sessionStorage.reload) {
sessionStorage.reload = true;
// optionnal
setTimeout( () => { sessionStorage.setItem('reload', false) }, 2000);
} else {
sessionStorage.setItem('reload', false);
}