0

親ドキュメントを更新する子 JavaScript アプリケーションを取得しようとしています。

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

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

無数の Web ページに、次のようなトリックを使用してこれを行う方法が説明されています。

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

しかし、IE でこれを行うと、親が更新されているように見えます。ページがリロードされていると思います。

これを少しトリッキーにするために:

  • すべてのブラウザー (または少なくとも IE と Firefox) 用のソリューションが必要です。
  • どちらの JavaScript プログラムも実際には GWT Web アプリです (そのため、特定のコードをさまざまなブラウザー バージョンに関連付けることができます)。
  • 必要に応じて、セキュリティを回避するために奇妙なことを行うことができます。親と子は常にお互いに認識されます。子は常に親によって呼び出されます。

さまざまな Web ページにリストされている他の多くのトリックを試しましたが、これまでのところ、実際に展開できるほど安定していてシンプルなものはありません。

4

2 に答える 2

1

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

于 2009-06-26T14:36:38.757 に答える
0

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

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履歴メカニズムでは、__ gwt_historyTokenが変更されるまで監視し、アプリを更新する必要があるということです。親の場所が変更された場合、「何か他のもの」もリロードを強制しているようです。どういうわけかこのGWTコードと統合せずに、ドキュメントの場所を変更することはできません。

于 2009-06-26T18:15:19.323 に答える