Tôi muốn kiểm tra khi ai đó cố gắng làm mới một trang.
Ví dụ, khi tôi mở một trang, không có gì xảy ra nhưng khi tôi làm mới trang thì nó sẽ hiển thị cảnh báo.
window.performance.navigation.typeđược chấp nhận, xin vui lòng xem câu trả lời của tôi .
Tôi muốn kiểm tra khi ai đó cố gắng làm mới một trang.
Ví dụ, khi tôi mở một trang, không có gì xảy ra nhưng khi tôi làm mới trang thì nó sẽ hiển thị cảnh báo.
window.performance.navigation.typeđược chấp nhận, xin vui lòng xem câu trả lời của tôi .
Câu trả lời:
Không window.performance.navigation.typeđược chấp nhận, vui lòng xem câu trả lời của
Một cách tốt hơn để biết rằng trang thực sự được tải lại là sử dụng đối tượng điều hướng được hầu hết các trình duyệt hiện đại hỗ trợ.
Nó sử dụng API thời gian điều hướng .
//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");
}
nguồn: https://developer.mozilla.org/en-US/docs/Web/API/Navlation_timing_API
performance.navigation.type == performance.navigation.TYPE_RELOADdễ đọc hơn thay vì == 1. Ngoài ra, nếu bạn kiểm tra, performance.navigationbạn sẽ thấy rằng có 4 loại điều hướng khác nhau như TYPE_BACK_FORWARD,TYPE_NAVIGATE
window.performance.navigation.typeđược chấp nhận, xin vui lòng xem câu trả lời của tôi .
Bước đầu tiên là kiểm tra sessionStoragemột số giá trị được xác định trước và nếu nó tồn tại cảnh báo người dùng:
if (sessionStorage.getItem("is_reloaded")) alert('Reloaded!');
Bước thứ hai là đặt sessionStoragethành một số giá trị (ví dụ true):
sessionStorage.setItem("is_reloaded", true);
Giá trị phiên được giữ cho đến khi trang được đóng để nó chỉ hoạt động nếu trang được tải lại trong một tab mới với trang web. Bạn cũng có thể tiếp tục tải lại theo cùng một cách.
trueđược chuyển đổi thành "true". 2). Lưu trữ phiên vẫn tồn tại cho đến khi người dùng đóng cửa sổ trình duyệt, do đó bạn không thể biết sự khác biệt giữa tải lại trang và điều hướng khỏi và quay lại trang web của bạn trong cùng một phiên trình duyệt.
window.performance.navigationthuộc tính không được dùng trong đặc tả cấp 2 của Timing Timing . Vui lòng sử dụng PerformanceNavigationTiminggiao diện thay thế.
Đây là một công nghệ thử nghiệm .
Kiểm tra bảng tương thích trình duyệt cẩn thận trước khi sử dụng trong sản xuất.

Thuộc tính chỉ đọc kiểu trả về một chuỗi đại diện cho loại điều hướng. Giá trị phải là một trong những điều sau đây:
điều hướng - Điều hướng bắt đầu bằng cách nhấp vào một liên kết, nhập URL vào thanh địa chỉ của trình duyệt, gửi biểu mẫu hoặc khởi tạo thông qua thao tác tập lệnh ngoài tải lại và back_forward như được liệt kê bên dưới.
tải lại - Điều hướng là thông qua hoạt động tải lại của trình duyệt hoặc location.reload().
back_forward - Điều hướng là thông qua hoạt động truyền tải lịch sử của trình duyệt.
prerender - Điều hướng được bắt đầu bởi một gợi ý prerender .
Khách sạn này chỉ đọc.
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);
}
}
Lưu trữ cookie lần đầu tiên khi ai đó truy cập trang. Khi kiểm tra làm mới nếu cookie của bạn tồn tại và nếu có, hãy cảnh báo.
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!');
}
}
và trong thẻ cơ thể của bạn:
<body onload="checkFirstVisit()">
nếu
event.currentTarget.performance.navigation.type
trả lại
0 => người dùng vừa nhập vào Url
1 => trang đã tải lại
2 => nút quay lại đã nhấp.
performance.navigation.typekhông được chấp nhận, xin vui lòng xem câu trả lời của tôi .
Tôi tìm thấy một số thông tin ở đây Phát hiện trang Javascript Làm mới . Đề xuất đầu tiên của anh ấy là sử dụng các trường ẩn, có xu hướng được lưu trữ thông qua làm mới trang.
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>
Referertính và sửa đổi phản hồi của máy chủ trên cơ sở của tài sản này
<script>phần tử xuống dưới cùng sẽ hoạt động - nhưng nó vẫn không phải là một giải pháp được đảm bảo (và cũng không phải là phương pháp cookie).
Referercũng không đáng tin cậy; nhiều proxy và phần mở rộng trình duyệt loại bỏ nó khỏi các yêu cầu.
Tôi đã viết hàm này để kiểm tra cả hai phương thức sử dụng cũ window.performance.navigationvà mới performance.getEntriesByType("navigation")cùng một lúc:
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;
}
Mô tả kết quả:
0: nhấp vào liên kết, Nhập URL vào thanh địa chỉ của trình duyệt, gửi biểu mẫu, Nhấp vào dấu trang, khởi tạo thông qua thao tác tập lệnh.
1: Nhấp vào nút Tải lại hoặc sử dụngLocation.reload()
2: Làm việc với lịch sử lông mày (Bakc và Forward).
3: hoạt động prerendering như<link rel="prerender" href="https://stackoverflow.com//example.com/next-page.html">
4: bất kỳ phương pháp nào khác.
if(sessionStorage.reload) {
sessionStorage.reload = true;
// optionnal
setTimeout( () => { sessionStorage.setItem('reload', false) }, 2000);
} else {
sessionStorage.setItem('reload', false);
}