48

地元のコミュニティ カレッジで、ちょっとしたプログラミングとウェブの仕事をしています。VBScript、javascript、Dreamweaver で生成された残骸の寄せ集めと、さまざまな詐欺師が何年にもわたって購入するよう説得してきたアドオンのコレクションで構成される、非常に大規模で魂を破壊する Web サイトの維持を含む作業。

数日前、「Safari を使用しているユーザーのために Web サイトがロックされています!」という電話がありました。ステップ 1 で Safari(v3.1.2) をダウンロードし、ステップ 2 でサイトにアクセスします。すべてが正常に動作しているようです。

要するに、私は最終的に問題を切り分け、それは Safari の戻るボタンに関連しています。このウェブサイトでは、私が試したすべてのブラウザー (Safari を含む) で動作する派手な JavaScript メニューを使用しています。しかし、Safari では、ページ外のリンクをたどってから戻るボタンを押すと、メニューが機能しなくなります。

原理を説明するために、簡素化された Web ページを作成しました。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>Safari Back Button Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body onload="alert('Hello');">
<a href="http://www.codinghorror.com">Coding Horror</a>
</body>
</html>

ページを読み込むと、アラート ボックスが表示されます。次に、ページからリンクをたどって、戻るボタンを押します。IE と Firefox では警告ボックスが再び表示されますが、Safari では表示されません。

精力的なグーグル検索の後、同様の問題を抱えている他の人を発見しましたが、本当に満足のいく答えはありません。だから私の質問は、ユーザーが他のブラウザと同じように戻るボタンを押した後、Safari でページを同じように動作させるにはどうすればよいですか?

これがばかげた質問である場合は、優しくしてください。javascript は私にとって少し新しいものです。

4

12 に答える 12

19

Stefan の iframe ソリューションは機能しますが、それが十分に洗練されていない場合は、次の JavaScript でも解決できることがわかります。

window.onunload = function(){};

つまり、メニューが JavaScript の場合、この問題も JavaScript で解決することをお勧めします。

アンロード イベント ハンドラー定義のアイデアは、この Firefox 1.5 の記事 ( https://developer.mozilla.org/en/Using_Firefox_1.5_caching )から生まれました。

于 2008-12-06T21:49:39.640 に答える
10

これをボディタグに入れるだけ <body onunload="">

これにより、戻るボタンを押すたびにサファリ、クロム、FFのリロードが強制されます

于 2011-05-01T04:33:16.853 に答える
9

キャッシュを無視するように指示するアドバイスには従わないでください。ページがキャッシュされる理由は、ユーザー エクスペリエンスを向上させるためです。使用している方法はユーザー エクスペリエンスを悪化させるため、ユーザーが嫌いでない限り、使用しないでください。

Safari (デスクトップおよび iOS) の正しい解決策は、pageshowイベントの代わりにイベントを使用することです (これらについては、 https://developer.mozilla.org/en-US/docs/Using_Firefox_1.5_cachingonloadを参照してください)。

イベントは、pageshowイベントが発生すると予想されると同時に発生しますonloadが、ページがキャッシュ経由で提供されている場合にも機能します。とにかく、これはあなたが望むもののようです。

于 2013-11-12T22:18:14.873 に答える
8

Mobile Safari の適切な解決策は次のとおりです。

/*! Reloads page on every visit */
function Reload() {
    try {
        var headElement = document.getElementsByTagName("head")[0];
        if (headElement && headElement.innerHTML)
            headElement.innerHTML += " ";
        } catch (e) {}
    }

    /*! Reloads on every visit in mobile safari */
    if ((/iphone|ipod|ipad.*os 5/gi).test(navigator.appVersion)) {
        window.onpageshow = function(evt) {
            if (evt.persisted) {
                document.body.style.display = "none";
                location.reload();
            }
        };
    }

ソース

必要に応じて変更しましたが、このままで問題ありません。(変更しないと、リフレッシュ時に白い画面が表示されます)。

于 2012-09-06T06:55:46.907 に答える
7

iframe は問題を解決します。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>Safari Back Button Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body onload="alert('Hello');">
<a href="http://www.codinghorror.com">Coding Horror</a>
<iframe style="height:0px;width:0px;visibility:hidden" src="about:blank">
this prevents back forward cache
</iframe>
</body>
</html>

詳細_

于 2008-08-23T07:36:39.470 に答える
4
$(window).bind("pageshow", function(event) {
  if (event.originalEvent.persisted) {
    window.location.reload() 
  }
});

ここmshahによって最近回答されました。

于 2016-04-21T14:58:06.737 に答える
3

何が問題を引き起こしているのかわかりませんが、誰があなたを助けることができるかはわかっています. Safari はWebkitに基づいて構築されており、(コミュニティ志向ではない) Apple を除いて、Webkit チームは問題が何であるかを知っているかもしれません。

まったくばかげた質問ではありません。

于 2008-08-23T06:50:34.947 に答える
3

私は非常によく似たものに気づきました。Firefox と IE は、戻るときにサーバーからページを再度取得し、Safari はそうではないためだと思います。ページの有効期限/キャッシュなしヘッダーを追加しようとしましたか? 動作を発見したときに調査するつもりでしたが、まだ時間がありませんでした。

于 2008-08-23T07:05:40.510 に答える
1

このスレッドが 1 年前のものであることは知っていますが、ProjectSeven の Safari の戻るボタンの修正を使用して、同じ Safari のみの問題を修正しました。魅力のように機能します。

http://www.projectseven.com/extensions/info/safaribbfix/index.htm

于 2010-05-27T21:23:49.953 に答える