ブラウザの戻るボタンで戻ると、フォームのすべてのフィールドをクリアします


88

ユーザーがブラウザの戻るボタンを使用したときに、フォーム内のすべてのフィールドをクリアする方法が必要です。現在、ブラウザは最後の値をすべて記憶しており、戻ったときにそれらを表示します。

これが必要な理由をさらに明確にするために 、特定のデータグループ内で一意にするためのアルゴリズムを使用して値が自動生成される無効な入力フィールドがあります。フォームを送信してデータをデータベースに入力すると、ユーザーは同じ値を再度使用して同じフォームを送信できなくなります。したがって、最初に入力フィールドを無効にしました。ただし、ユーザーがブラウザの[戻る]ボタンを使用すると、ブラウザは最後の値を記憶し、同じ値が入力フィールドに保持されます。したがって、ユーザーは同じ値でフォームを再度送信できます。

私が理解していないのは、ブラウザの戻るボタンを押したときに正確に何が起こるかです。ページサイズがブラウザのキャッシュ制限内にある場合、サーバーに接続せずにページ全体がキャッシュから取得されるようです。ブラウザの戻るボタンを押したときに、ブラウザの設定に関係なく、ページがサーバーから読み込まれるようにするにはどうすればよいですか?


生成された値をHTMLフォームに保存しないでください。サーバー上で生成します。
DAN

オートコンプリート機能を失うことなく、AMP(カスタムJSなし)でこれを行うにはどうすればよいですか?
PrathameshGharat20年

回答:


82

最新のブラウザは、バックフォワードキャッシュ(BFCache)と呼ばれるものを実装しています。戻る/進むボタンを押すと、実際のページは再読み込みされません(スクリプトは再実行されません)。

ユーザーが戻る/進むキーを押した場合に何かをする必要がある場合は、BFCachepageshowpagehideイベントをリッスンします。

window.addEventListener("pageshow", () => {
  // update hidden input field
});

GeckoWebKitの実装の詳細を参照してください。


私にとって完璧に働いた。ありがとう!
Prabin Pebam 2012年

また、動作を確認しました。入力を手動でリセットし、機能しているようです。ありがとう!
アンディ

87

JavaScriptを使用<form autocomplete="off">しない別の方法は、ブラウザーがフォームに最後の値を再入力しないようにすることです。

この質問も参照してください

<input type="text"フォーム内の単一の>でのみこれをテストしましたが、現在のChromeとFirefoxでは正常に動作しますが、残念ながらIE10では動作しません。


1
これはうまく機能しますが、私にとって、これが前後に押すときに入力値を削除する理由は本当に不可解です。その機能を維持したいが、ブラウザの実際のオートコンプリートを防ぎたい場合はどうなりますか?それが私が欲しいものです。w3schoolsの記事には、ここで説明した機能を実行するとは書かれていません。
mikato 2015

これは、履歴をナビゲートするときにフォームを元の値にリセットするのに最適です。
Craig Harshbarger 2016

5
これは、単一の要素に適用した場合にも機能します。<input type="text" autocomplete="off">
Jakub Kaleta 2017

1
入力では正しく機能しますが、textareaでは機能しません
BassemShahin19年

29

ChromeでBFCache(戻る/進むボタンのキャッシュ)に関連するフォーム全体をクリアする方法を探しているときに、この投稿に出くわしました。

Simが提供したものに加えて、私のユースケースでは、詳細を[戻る]ボタンの[フォームクリア]と組み合わせる必要がありましたか?

これを行う最良の方法は、フォームが期待どおりに動作できるようにし、イベントをトリガーすることです。

$(window).bind("pageshow", function() {
    var form = $('form'); 
    // let the browser natively reset defaults
    form[0].reset();
});

inputJavaScriptでオブジェクトを生成するためのイベント、またはその他のことを処理していない場合は、これで完了です。ただし、イベントをリッスンしている場合は、少なくともChromeでは、change自分でイベント(またはカスタムイベントを含む、処理したいイベント)をトリガーする必要があります。

form.find(':input').not(':button,:submit,:reset,:hidden').trigger('change');

それは何か良いことをするためにのに追加されなければなりresetません。


2
reset()は非表示の入力フィールドでは機能しないことに注意してください。
ダミアン

14

古いブラウザとの互換性も必要な場合は、「pageshow」オプションが機能しない可能性があります。次のコードは私のために働いた。

$(window).load(function() {
    $('form').get(0).reset(); //clear form data on page load
});

7

これは私のために働いたものです。

$(window).bind("pageshow", function() {
    $("#id").val('');
    $("#another_id").val('');
});

私は最初$(document).ready、jqueryのセクションでこれを持っていましたが、これも機能しました。ただ、$(document).ready戻るボタンを押すとすべてのブラウザが起動するとは限らないと聞いたので取り出しました。このアプローチの長所と短所はわかりませんが、複数のブラウザーと複数のデバイスでテストしましたが、このソリューションに問題は見つかりませんでした。


これは私を大いに助けました:)
acmsohail 2017

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.