web-dev-qa-db-ja.com

IE

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

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

すべての読み込みが完了した後、ハッシュを変更するための良い方法を理解できないようです。そして同時に、それが負荷に関連していることさえ肯定的ではありません。

これを解決する方法に関するアイデアはありますか?

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

24
aepheus

これはInternet Explorerのバグのようです(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つにリロードを指定します。

18
Jarne Cook

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

あなたはただ行うことができるかもしれません:

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

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

14
rjmunro

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

location.href = 'test1.aspx#testhash'

大丈夫でしょう !

IEバグ:リダイレクト経由のWebアプリの場合、ブラウザは前のURLしか表示しない可能性があるため、location.hashを変更すると、ブラウザはURLの変更を確認します、ページを更新します。

10
张小生

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

1
Dmitry

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

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

これがヘッドセクションに追加された修正です。

<!--[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]-->
1
Rishabh

同じ問題がありました。

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

0
jan.vdbergh

これがクロスブラウザソリューションです。 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が前のURLと異なるようにする必要があります。

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

お役に立てれば。

0
Eye