誰かがページを更新しようとしたときに確認したいと思います。
たとえば、ページを開いても何も起こりませんが、ページを更新すると警告が表示されます。
誰かがページを更新しようとしたときに確認したいと思います。
たとえば、ページを開いても何も起こりませんが、ページを更新すると警告が表示されます。
回答:
⚠️⚠️⚠️is window.performance.navigation.type
deprecated、pls seeИльяЗеленько's answer
ページが実際にリロードされていることを知るためのより良い方法は、ほとんどの最新のブラウザーでサポートされているナビゲーターオブジェクトを使用することです。
//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!');
2番目のステップは、sessionStorage
ある値(たとえばtrue
)に設定することです。
sessionStorage.setItem("is_reloaded", true);
セッション値はページが閉じられるまで保持されるため、ページがサイトの新しいタブで再読み込みされた場合にのみ機能します。同じ方法でリロード回数を維持することもできます。
true
、に変換され"true"
ます。2)。セッションストレージは、ユーザーがブラウザウィンドウを閉じるまで存続するため、ページのリロードと、同じブラウザセッション内でのサイトからの移動とサイトへの移動の違いを見分けることはできません。
window.performance.navigation
プロパティは、Navigation Timing Level 2仕様では非推奨です。代わりにインターフェースを使用してください。PerformanceNavigationTiming
これは実験的な技術です。
ブラウザの互換性表を確認してくださいこれを本番環境で使用する前に注意深く。
タイプの読み取り専用プロパティは、ナビゲーションのタイプを表す文字列を返します。値は次のいずれかである必要があります。
ナビゲート —ナビゲーションは、リンクをクリックするか、ブラウザーのアドレスバーにURLを入力するか、フォームを送信するか、以下にリストされているreloadおよびback_forward以外のスクリプト操作で初期化します。
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 =>ユーザーがURLを入力した
1 =>ページが再読み込みされた
2 =>戻るボタンがクリックされた
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>
要素を一番下に移動しても機能しますが、それでも保証された解決策ではありません(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);
}