누군가 페이지를 새로 고치려고 할 때 확인하고 싶습니다.
예를 들어 페이지를 열면 아무 일도 일어나지 않지만 페이지를 새로 고치면 경고가 표시됩니다.
window.performance.navigation.type는 더 이상 사용되지 않으며 pls는 내 답변을 참조하십시오 .
누군가 페이지를 새로 고치려고 할 때 확인하고 싶습니다.
예를 들어 페이지를 열면 아무 일도 일어나지 않지만 페이지를 새로 고치면 경고가 표시됩니다.
window.performance.navigation.type는 더 이상 사용되지 않으며 pls는 내 답변을 참조하십시오 .
답변:
⚠️⚠️⚠️ window.performance.navigation.type는 더 이상 사용되지 않으며 pls는 Илья Зеленько 님의 답변을 참조하십시오
페이지가 실제로 다시로드되는지 확인하는 가장 좋은 방법은 대부분의 최신 브라우저에서 지원하는 탐색기 개체를 사용하는 것입니다.
Navigation Timing 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
window.performance.navigation.type는 더 이상 사용되지 않으며 pls는 내 답변을 참조하십시오 .
첫 번째 단계는 sessionStorage미리 정의 된 값과 경고 사용자가 있는지 확인하는 것입니다.
if (sessionStorage.getItem("is_reloaded")) alert('Reloaded!');
두 번째 단계는 sessionStorage어떤 값 으로 설정 하는 것입니다 (예 true:) :
sessionStorage.setItem("is_reloaded", true);
페이지가 닫힐 때까지 세션 값이 유지되므로 사이트가있는 새 탭에서 페이지를 다시로드 한 경우에만 작동합니다. 다시로드 횟수를 같은 방식으로 유지할 수도 있습니다.
true로 변환됩니다 "true". 2). 사용자가 브라우저 창을 닫을 때까지 세션 저장소가 유지되므로 동일한 브라우저 세션 내에서 페이지를 다시로드하고 사이트를 탐색하거나 사이트에서 다시 탐색하는 것의 차이점을 알 수 없습니다.
window.performance.navigation탐색 타이밍 레벨 2 스펙 에서는이 특성이 더 이상 사용되지 않습니다 . 대신 인터페이스를 사용하십시오 .PerformanceNavigationTiming
이것은 실험적인 기술 입니다.
프로덕션 환경에서 사용하기 전에 브라우저 호환성 표를 주의 깊게 확인하십시오 .

type 읽기 전용 속성은 탐색 유형을 나타내는 문자열을 반환합니다. 값은 다음 중 하나 여야합니다.
탐색 — 링크를 클릭하거나 브라우저의 주소 표시 줄에 URL을 입력하거나 양식을 제출하거나 아래에 표시된 것처럼 reload 및 back_forward 이외의 스크립트 작업을 통해 초기화하여 탐색을 시작했습니다.
다시로드 — 탐색은 브라우저의 다시로드 작업 또는을 통해 이루어 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 => 뒤로 버튼 클릭
performance.navigation.type더 이상 사용되지 않습니다, pls는 내 대답을 참조하십시오 .
Javascript Detecting 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>요소를 맨 아래로 이동하면 작동하지만 여전히 보장되는 솔루션은 아니며 쿠키 방법도 아닙니다.
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 : 다른 방법.
if(sessionStorage.reload) {
sessionStorage.reload = true;
// optionnal
setTimeout( () => { sessionStorage.setItem('reload', false) }, 2000);
} else {
sessionStorage.setItem('reload', false);
}