2009-06-26 10 views
0

私は親のドキュメントを更新するために子のJavaScriptアプリケーションを取得しようとしています。iframeがリフレッシュせずに、親のURLフラグメントを変更するにはどうすればよいですか?

  • は、JavaScriptのプログラムはそれ自身の文書にはiframe を開きます。

    は本質的には、これは非常に単純な問題です。

  • 別のJavaScriptプログラムが のiframeに読み込まれています。
  • 2番目のプログラムは、 ページのフラグメント(アンカー)を に変更する必要があります。
  • 最初のプログラムでは、 新しいフラグメントに移動します(ドキュメント位置 は更新されましたが、ドキュメントは がリフレッシュされていません)。

は、Webページの無限の数のようなトリックを使用して、これを行う方法の説明があります。

window.parent.location.hash = "#" + string 

しかし、私はIEでこれを行うとき、親は自分自身をリフレッシュすることが表示されます。私はページがリロードしていると思う。

ただ、これは少しトリッキーにする:

  • 私はすべてのブラウザ(または非常に少なくとも、IEとFirefox)のためのソリューションを必要としています。
  • JavaScriptプログラムはどちらも実際にGWTウェブアプリケーションです(別のブラウザのバージョンに特定のコードを割り当てることができます)。
  • 必要に応じてセキュリティを守るために変なことをすることができます。親と子は常に互いに知り合っています。子は常に親によって呼び出されます。

私はさまざまなWebページにリストされている他のトリックを試しましたが、これまで実際に展開するのに十分な安定性とシンプルさはありませんでした。

答えて

1

ブラウザによっては、element.scrollIntoViewまたはscrollToを使用してください。

+0

これは面白いですが、GWTはその場でアンカーを作成すると思いますので、実際にその部分に行くまでは要素がありません。 –

+0

少なくとも、私はその断片に行くまで、要素を参照する方法がありません。 –

+0

'"# "+ string'は、文字列がidであることを私に伝えます。もしそれがあれば、要素を得ることができます – geowa4

0

私は(GWTによって生成された)私のアプリでは、以下のJavaScriptを見つけました:

function $initUrlCheckTimer(this$static){ 
    var historyImplRef = this$static; 
    var urlChecker = function(){ 
    $wnd.setTimeout(urlChecker, 250); 
    var hash = getLocationHash(); 
    if (hash.length > 0) { 
     var token = ''; 
     try { 
     token = historyImplRef.decodeFragment(hash.substring(1)); 
     } 
     catch (e) { 
     $wnd.location.reload(); 
     } 
     var historyToken = ($clinit_75() , $wnd.__gwt_historyToken || ''); 
     if (historyToken && token != historyToken) { 
     $wnd.location.reload(); 
     } 
    } 
    } 
    ; 
    urlChecker(); 
} 

私はGWTのトップレベルの文書は、アプリケーション1にダウンコールした旨の通知(生成されたコードは、親を割り当てることで始まりました$ wnd、$ wnd.locationは私の実際のURLです)。

GWTの歴史mechは、__gwt_historyTokenを見て、変更してからアプリをアップデートするまでです。親の場所が変更された場合、「何か他のもの」も再読み込みを強制しているようです。私はちょうどこのGWTコードとそれを統合することなく、ドキュメントの場所を変更することはできません。