0

私が解決しようとしていることを説明する:

ファイルのリストを表示するWeb ページ (file_list.php )があり、各ファイルの横に削除ボタンがあります。ユーザーが特定のファイル名の近くで [DELETE] ボタンを押すと、ブラウザーはdelete_file.phpファイルを削除するというスクリプトに移動し、ブラウザーに戻るように指示します。file_list.php

delete_file.phpシンプルheader("Location: file_list.php”);に戻るfile_list.php

ブラウザに戻るとfile_list.phpページがリロードされますが、ユーザーが以前いた場所に再度スクロールすることはありません。ユーザーがファイル リストをスクロールし、最後のファイルを削除したとします。ブラウザがページを再度表示したときに、file_list.phpページの一番下までスクロールされることはありません。



私が思いついた回避策:

私はこれを回避するための奇妙な方法を見つけました。header("Location: file_list.php”);delete_file.phpwindow.history.go(-1)

この回避策は、ユーザーがセッション中である場合(単純に PHPsession_start関数を使用する場合)に完全に機能します。ブラウザーは file_list.php ページをリロードし、それを以前の場所にスクロールして戻します。 ただし、ユーザーがセッションに参加していない場合、ブラウザはページをスクロールしますが、以前に再ロードしないため、ユーザーは削除したファイルをファイル リストに表示します。



質問

  1. セッションにいない場合でも、セッションに戻ったときにブラウザーの動作を再現する方法を知っていますか?

  2. この問題を解決する別の方法を知っていますか?

ありがとう!

AJAX を使用してファイルを削除できることはわかっているので、毎回 delete_file.php に移動する必要はありませんが、これは答えではありません

4

4 に答える 4

5

アンカーを放出できます:

<a name="anchor1"/>filename_this
<a name="anchor2"/>filename_that

を削除するfilename_thisには、削除ページの filename_this とanchor1. 削除ページは次にリダイレクトされますfile_list.php#anchor1

アンカー名はファイル名にマップされるべきではないことに注意してください。そうすれば、5番目のファイルを削除すると、アンカーは「新しい」5番目のファイル(古いファイルがあった場所)の近くにあります。

于 2010-05-31T19:37:02.593 に答える
3

ブラウザは通常、ユーザーがどこにいたかを覚えています。ページ A から B に移動してから (戻るボタンで) 戻ると、ページ A の同じ場所に到達するはずです。

を使用するheader('location: A.php');と、ブラウザーに別のページに進むように指示することになります。これまでに存在したことがないため、スクロール位置が何であったかを知ることができません。

を使用するhistory.go(-1)と、ブラウザーに [戻る] ボタンをクリックするように指示することになります。これが、回避策が機能する理由です。no-cacheヘッダーを出力している可能性が高いため、ブラウザーがページをリロードしています。ここでの効果は、(ナビゲートせずに) ページをリロードするのと同じです。これに関する問題は、ユーザーが「進む」ボタンをクリックして、delete_file.php再度アクセスできることです (別のファイルを誤って削除してしまう可能性があります)。

いくつかのアイデア:

  • ページに一連のアンカー (ファイルごとに 1 つ) を配置し、ユーザーがクリックした場所に最も近いアンカーにリダイレクトできます。したがって、ファイル 4 を削除した場合は、ファイル 3 にリダイレクトしますheader('file_list.php#file3');
  • 現在のスクロール位置を JavaScript で計算し、Cookie に保存します。ページがリロードされたら、javascript を使用して元の場所までスクロールします (これを行うのは 1 回だけにしてください。3 日後にページにアクセスして、特に理由もなく中央までスクロールすると混乱する可能性があります)。
  • AJAX を使用してバックグラウンドでファイルを削除することもできます。ここでは、ブラウザにスクロールを処理させています。これはあなたが探している答えではないかもしれませんが、確かに解決策です。

私の意見では、最良の解決策は最も単純で、ページを短くすることです。ページがスクロールできるほど長くなくても、問題はありません。

于 2010-05-31T20:07:57.027 に答える
0

要約すると、あなたのステップは次のとおりです。

1)「ファイルのリストを表示するWebページ(file_list.php)」

2)「ファイルを削除してからブラウザにfile_list.phpに戻るように指示するdelete_file.php」

file_list.phpにはディレクトリの現在の内容のみが表示され、削除したファイルは明らかに含まれていないと思います。ただし、file_list.phpを使用して、削除したばかりのファイルについてユーザーにヒントを与える必要があります。たとえば、ファイルがまだ存在している場合にファイルが通常リストにある位置に戻るなどです。これを行うには、おそらく数十の方法があります。

1)delete_file.phpは、URL「/file_list.php#the_file_i_just_dele.ted」を開きます。ディレクトリの内容を配列に集めたら、おそらくアルファベット順などで、その配列に「the_file_i_just_dele.ted」を挿入します。その配列には別のブールフィールドが必要です: "deleted" => 1 | 0、これは削除されたファイルの場合は1になります。配列を進めてリストをエコーし​​ながら、各リスト項目の横にhtmlアンカー(単にファイル名の場合もあります)を追加します。「削除済み」が1の場合、その横にある「削除」ボタンをエコーし​​ないでください。ページを開くと、ページは「the_file_i_just_dele.ted」アンカーに直接ジャンプします。

2)ajaxを使用します。

3)すべてのファイルシステムアクション用に個別のphpライブラリファイルを用意します。file_list.phpは、クライアントが表示する必要がある唯一のページです。削除すると、file_list.phpはURLに「#deleted」を追加して自分自身に投稿し、ディレクトリの内容を配列に収集してから、要求されたファイル削除し、配列をエコーし​​ます。削除したファイルがループで検出された場合は、無効にするか、 「削除」ボタンを描画せず、そのすぐ隣に「削除済み」のhtmlアンカーをエコーし​​ます。ページを開くと、クライアントは自動的に「削除された」アンカーにジャンプします。

4)ショッピングカートを作成し、「ユーザーが前のページのどこにいるかを追跡する」というこの問題全体を気にしないでください。削除する各ファイルをチェックしてもらいます。「ショッピング」エクスペリエンスが複数のディレクトリとページにまたがる場合は、Cookie、DB、またはセッションファイルを使用してカートの内容を追跡します。ユーザーは、ページの下部にある1つの[削除]ボタンをクリックします。必要に応じて、リストされたファイルの削除を確認するようにユーザーに求める「チェックアウト確認」ページを追加します。

...等...

必要に応じて、ソリューションを組み合わせて使用​​することもできます。

于 2010-05-31T21:35:07.303 に答える
0

IFRAME に送信するのはどうですか? (JS がまったくありませんか?削除されたエントリを非表示にすることはできません...)

于 2010-05-31T19:41:00.757 に答える