2

質問のために、単純な架空のシナリオを作成する必要があります。

リンクが 1 つある次の簡単なページがあり、ページ A と呼びます。

<a class="red-anchor" onclick="change_color(event);" href="http://mysite.com/b/">B</a>

関連する Javascript 関数を使用すると、次のようになります。

function change_color(e)
{
  var event = e || window.event;
  var link = event.target;
  link.className = "green-anchor";
}

そして、クラス名に基づいてアンカーを赤または緑にする適切な CSS があります。

これは機能しています。つまり、アンカーをクリックすると、色が赤から緑に変わり、ブラウザーがページ B をロードする前に一時的に表示されます。

しかし、[戻る] ボタンを使用してページに戻ると、AI はブラウザーごとに異なる動作をします。

  • Safari では、アンカーはまだ緑色です (望ましい動作)
  • Firefox では赤に戻ります

Safari はページのキャッシュされたバージョンを何らかの形で更新していると思いますが、Firefox はそうではありません。

だから私の最初の質問は:キャッシュされたページを更新するために FF を取得する方法はありますか、それともここで何か他のことが起こっていますか?

第二に、私は ajax 呼び出しを使用する別の実装をしています。これで、セッション変数を使用してアンカーのクラスを設定します...

<a class="<?php echo $_SESSION["color"]; ?>"  ...[snip]... >B</a>

そして、javascript 関数は、「色」セッション変数を変更する追加の ajax 呼び出しを行います。

この場合、Safari と Firefox の両方が期待どおりに動作します。B から A に戻るとき、色はまだ緑色です。しかし、なぜそれが非ajaxの場合と異なるのか、私の人生では理解できません。私はさまざまな順列を試しましたが、FF で機能するためには、「色」セッション変数を変更する必要があります (つまり、ajax 呼び出し自体がキャッシュをリロードしていません)。しかし、戻ってくると、ページはキャッシュからリロードされます (Firebug で検証済み)。そのため、ページを再処理してアンカーでその php のフラグメントを実行していない場合、ページはどのようにこのセッション変数にアクセスするのでしょうか?

ここには、私が理解していない基本的な何かがあるに違いないと思います。どんな洞察も大歓迎です。

4

2 に答える 2

3

私自身の質問に答えるために、これはキャッシュの問題でした。Safari はページをキャッシュしていませんでした。そのため、DOM に対する Javascript の変更が、別の場所に移動して [戻る] ボタンを使用して戻るまで保持されているように見えました。

要約する:

  1. キャッシュされたバージョンはページと共に最初に読み込まれたバージョンであるため、どちらのブラウザーでも、ページ読み込み後の Javascript の変更は存続しません。
  2. FF は Cache-Control ヘッダー ディレクティブで「no-store」を必要とするため、FF と Safari の動作は異なります。ページのキャッシュを無効にするには「no-cache」では不十分です。

#2 の詳細については、http: //blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/を参照してください。

于 2010-04-17T23:05:02.627 に答える
1

Firefox では赤に戻ります

赤いままなのであまり赤く戻りません。「戻る」ときは新しいページではなく、まったく同じページ オブジェクトです。ページから離れたときにのみ非表示になり、すぐに破棄されるわけではありません。戻ると、古い DOM が画面に引き戻され、加えたすべての変更が加えられ、その中で実行されているすべてのスクリプト コンテンツが引き続き動作します。

この機能はbfcacheと呼ばれ、Firefox と Safari の両方 (および Opera) に搭載されています。Safari で起動しない理由がわかりません... ブラウザのキャッシュ設定が異なる可能性があります。ナビゲートしたり、より長く待機したりして、ページをキャッシュからクリアしたかなどです。

キャッシュされたページを更新するために FF を取得する方法はありますか

onunload任意のイベント ハンドラー( do-nothingであっても) をオンに設定することで bfcache を解除できますが、function() {}理想的ではありません。ページ内のナビゲーションが不必要に遅くなります。色の変更の目的は何ですか? 戻ったときにリセットする必要があることを示すものは何ですか?

リンクをクリックして Escape を押してナビゲーションをキャンセルするとどうなるでしょうか? setTimeout通話、ナビゲーションの色を元に戻すかどうかはどうですか?

于 2010-04-17T20:03:37.833 に答える