24

ハッシュを変更し、特定の処理が行われた後に削除して、ユーザーが更新した場合にプロセスが再度実行されないようにする必要があります。

これは FF では正常に動作しますが、ハッシュを変更しようとするたびに IE がリロードしているようです。確かではありませんが、ページにロードされている他のものに関連していると思います。(プロセスに関連して) ロードする iframe と、親ウィンドウでまだフェッチされているいくつかのスクリプトがあります。

すべての読み込みが完了した後にハッシュを変更する良い方法を見つけられないようです。そして同時に、それが負荷に関係しているとは確信していません。

これを解決する方法についてのアイデアはありますか?

さらに奇妙な動作: ハッシュは、リダイレクトを介して Web アプリ内の別の場所から取得されます。#myid を URL に追加してハッシュを手動で追加すると、リロードされないことがわかりました。すでに読み込まれているページにハッシュを入力する (既存の URL に #myid を追加する) か、新しいタブに完全な URL を入力するかは問題ではありません。

4

9 に答える 9

18

これはInternetExplorerのバグのようです(7および8でテスト済み)。

window.location.hashを変更してもリロードは発生しません。これは、状態を維持するためにハッシュを使用する一般的なJavaScript手法です。

手動でページをロードし、JavaScriptを使用してハッシュを変更すると、機能します。

問題は、別の場所からページにリダイレクトされた場合(つまり、HTTPヘッダー「Location」を使用した場合)、ハッシュを変更するとリロードが発生することです。

このバグを回避するには、次の方法があります。

1)リダイレクトを制御できる場合は、LocationヘッダーをHTMLに置き換えることができます。

<html>
<head>
    <meta http-equiv="refresh" content="0; url=__REDIRECT_LOCATION__">
    <script>window.location = "__REDIRECT_LOCATION__";</script>
</head>
</html>

2)そうでない場合は、ページが読み込まれたときにページを再読み込みしてみてください。リロードループを防ぐために、Cookieを設定する必要がある場合があります。

window.location = window.location; // window.location.reload() didn't work.

In pseudo code: 

// if is Internet Explorer
//      if ( cookie "reloadPerformed" is not set )
//          set cookie "reloadPerformed" = "1"
//          reload page
//      else 
//          clear cookie "reloadPerformed"

明らかに欠点は、ページをロードすると2ページのリクエストとレンダリングが発生することです。そのため、ページをロードするときに最初に行うことの1つをリロードする必要があります。

于 2010-07-20T01:43:57.443 に答える
14

@JarneCookは正しいようです - これは IE のバグです。

あなたはただできるかもしれません:

<script type="text/javascript">
  window.location.hash = window.location.hash;
</script>

あなたのページの上部にあります。通常の状況では、これは何もしないはずですが、ユーザーが IE を使用していて、リダイレクト経由でアクセスした場合、ページが読み込まれたことに気付く前に、ページがリロードされます。

于 2010-09-27T14:14:12.183 に答える
10

問題は、「ハッシュがリダイレクトを介してWebアプリの他の場所から来ている」ことです。次のように、JavaScript を使用してクライアントで URL をリダイレクトする場合:

location.href = 'test1.aspx#testhash'

大丈夫でしょう !

これが IE のバグです: リダイレクトを介した Web アプリケーションの場合、ブラウザには前の URL しか表示されないことがlocation.hashあります。

于 2010-05-13T02:33:04.307 に答える
1

この問題に直面していました。回答の1つで示唆されているように、問題は302/301リダイレクトの場合のみでした。ページがリダイレクトでない場合、ハッシュの変更はリロードされません。私は PHP を使用してリダイレクトしていましたが、Cookie を使用してリダイレクトを停止したくありませんでした。

この問題はさらに、一部の IE9 ブラウザにもあり、5 つの IE9 ブラウザを試したところ、4 つがページをリロードしました。

head セクションにこれを追加した修正を次に示します。

<!--[if lt IE 10]>
    <script type="text/javascript">
        if(window.location.hash.replace('#','').length > 0
            && window.location.hash.search('stopredirectioninie') == -1)
        {
            window.location.href = window.location.href+'&stopredirectioninie';
        }
    </script>
<![endif]-->
于 2013-01-07T12:24:05.283 に答える
1

私のプロジェクトにも同様の問題がありました。しかし、IE がページを更新すると、プリロードされたデータがリセットされたため、上記の方法を使用できませんでした。そこで、ブラウザの機能を利用しました。「a」タグをクリックすると、最初に onClick イベントが発生し、イベント後、ブラウザはリダイレクトに「href」属性を使用します。IE がリダイレクトにハッシュ付きの href を使用する場合、リロードは存在しません。したがって、onClick イベントを使用してサーバー側の処理を呼び出すことができます (たとえば、asp.net の場合は __doPostBack)。処理が実行されると、ブラウザーはリダイレクトに「href」属性を使用します。したがって、新しいページはリロードされません。またwindow.location = yourNewLocationWithHash、サーバー側の処理後に呼び出しを使用することもできます。これが役立つことを願っています=)

于 2011-02-04T12:21:25.703 に答える
0

これがクロスブラウザソリューションです。IE、Chrome、Safari、およびFFで動作します(最新バージョンで試してみました)。

var pos = location.href.indexOf('c=');
location = (pos < 0 ?
                    location + (location.href.indexOf('?') < 0 ? '?' : '&')
                    : location.href.substring(0, pos))
           + 'c=' + Math.floor(Math.random()*11) + '#' + comment_id ;

基本的に、クエリ( "?")文字列を利用して、ハッシュでページのリロードをトリガーします。最初の行は、「ゴールデン」クエリ文字列があるかどうかをチェックします(「コメント」を表す「c」変数を使用します)。もしあれば、

  1. 新しいURLには、その「c=」より前のすべてが含まれます。
  2. 次に、ゴールデン "c =" +0から10までの乱数+"#"+リロード時にブラウザがジャンプする必要のあるコメントIDを追加します。

ない場合は、

  1. 新しいURLには、以前のURLがすべて含まれます。
  2. 古いURLにすでに他のクエリ文字列(「?」の後の何か)が含まれている場合は、クエリ追加演算子「&」を追加します。
  3. 「?」がない場合は、それを追加します。
  4. 次に、上記の「ゴールデン」クエリを実行します。

「?」の後に乱数を追加する理由 最初のリロードの後に​​「?#comment-10」のようなものがあるということです。この場合、ブラウザはページをアンカージャンプ命令として理解するため、URLを次に変更してもページは再読み込みされません。

リロードを強制するには、新しいURLが以前と異なるように、クエリにランダムなものを追加する必要があります。

このソリューションはすべてのブラウザで機能し、リロードによって既存のクエリが破損しないようにします。唯一の注意点は、「ゴールデン」クエリ変数名が一意であることを確認することです。

お役に立てれば。

于 2012-01-19T03:50:56.537 に答える
0

同じ問題がありました。

私たちの場合、Apache によって https にリダイレクトされた http URL で構成されていました。ハッシュ記号の後の文字列はサーバーに渡されないため、失われました。

于 2014-05-07T12:19:41.757 に答える
-3

JavaScript を使用してハッシュを設定する場合は、「#」を使用しないでください。

window.location.hash = '#foo'; //IE will reload the page
window.location.hash = 'foo'; //IE will set the hash but will not reload the page
于 2010-05-31T09:34:06.287 に答える
-5

ハッシュを変更すると、基本的にページの場所が変更されるため、IE(または任意のブラウザ)がリロードされるように思われます。どのようにこれを行おうとしていますか?window.location.hash = "";

たぶんFirefoxは、あなたが何をしているかを確認し、更新を回避するのに十分賢いのかもしれません。

于 2010-04-08T18:08:09.987 に答える