3

私のjavascriptコードはいくつかのウィンドウトラフを開きます:

var win = window.open();

開いている他のすべてのウィンドウとの配列にwin参照を格納します。
オープナーが更新されるまで、すべてが正常に機能します。

したがって、私が達成したいのは、「マスター」ウィンドウがロードされたときに、開いているウィンドウへのすべての参照を取り戻すことです。

これを実現するには、次のことを行う必要があり
ます。1.アンロード時にすべての参照を永続化する2.ロード時に参照を取得する3.新しいオープナーで参照を更新する

出来ますか?もしそうなら、どのように?

4

3 に答える 3

4

これは非常に複雑に聞こえます (読み: 問題あり)。

あなたが求めているのは、以前から問題であり、元の HTTP プロトコルにまでさかのぼります。

短い答えはノーです。これは実際には不可能です。親を更新すると、子へのすべての参照が失われます。実際には、それは非常に現実的です....親は「リフレッシュ」されます....子供たちは、親が残したすべてのリソースを取得します...申し訳ありませんが、トピックから外れています。Web はステートレスであるため、ページが更新、再読み込み、閉じられる、開かれる、または他の動詞が関連付けられると、そのページは新しいドキュメントとして扱われます。


これは chrome/FireFox では正常に機能しますが、IE では機能しません。

次のようなものは機能しますが、子/親の間の関係を再接続するには、子から行う必要があります。以下のスクリプト/マークアップで例を示します。だから私はそれを使用しませんが、例としてここに示します。

手順:

  • 子を開く
  • 子に移動
  • 親をリフレッシュ
  • **親 -> 子関係が失われます。
  • **子 -> 親の関係はまだ存在します。
  • 親をリンク
  • 親ページへ
  • 関係をチェック
  • **親がnullではないことがわかります
  • 親にとどまる
  • 子をリフレッシュ

HTMLPage.htm:

<input type="button" onclick="openChild();" value="Open Child" />
<input type="button" onclick="refreshParent();" value="Refresh Parent" />
<input type="button" onclick="linkParent();" value="Link Parent" />
<input type="button" onclick="checkRelationship();" value="Check Relationship" />
<input type="button" onclick="refreshChild();" value="Refresh Child" />


<script type="text/javascript" language="javascript">

    var child;    
    function openChild() {
        child = window.open("HTMLPage.htm");
    }

    function refreshParent() {
        alert("refreshing parent");
        window.opener.location.href = window.opener.location.href;
    }

    function linkParent() {
        window.opener.child = window;
        checkRelationship();
    }

    function checkRelationship() {
        alert("Parent: " + window.opener + ".   Children:" + child);
    }

    function refreshChild() {
        child.location.href = child.location.href;
    }


</script>

それでは、私の次の質問は次のとおりです。

これで何を達成しようとしていますか?状況が本当に必要な場合は、モーダルウィンドウ/ポップアップウィンドウを使用することにすべて賛成ですが、それらの配列が必要ですか?

親ページは更新する必要がありますか? 親ページにiframeを貼り付けて更新していただけますか(メインページを更新する必要がないIE.ファイルのアップロードなど)。

私は Apple ファン ボーイとはほど遠いですが、このリンクは、スクリプトで IFrame を使用することについての良い洞察を与えてくれます: http://developer.apple.com/internet/webcontent/iframe.html

これが役立つことを願っています。

于 2010-09-24T16:10:30.317 に答える
3

問題をどのように解決したか。

子ウィンドウの「opener」プロパティは、それを開いたWINDOWへの参照を保持するため、マスターウィンドウが更新されてもウィンドウは変更されないため、オープナー参照は同じままです。オープナーがnullの場合は、ウィンドウが閉じている場合のみです*

マスターウィンドウのアンロードイベントで、タイムアウトを設定する子ウィンドウでjavaScript関数を呼び出します。タイムアウトが終了したら、オープナー参照をテストし、参照がまだ正しいため、登録し直そうとします。

このようにして、すべての子参照を元に戻します!! ;)

もちろん、マスターウィンドウに読み込まれたドキュメントが私のドキュメントではない場合、たとえば、www.google.comが子参照を登録し直すと失敗します。

このソリューションは、Firefox、IE、Chromeでテストされています。

* Chromeでは、新しいアドレスを入力すると新しいウィンドウが開始されるため、オープナーもnullになります。

于 2010-10-05T14:35:21.567 に答える
0

メインウィンドウの更新を避ける(AJAXまたはiframeを使用)か、「メインウィンドウ」をフレームセットに入れて、実際には「メインフレーム」のみがリロードされるようにします-その後、変数を親フレームに貼り付けることができます

于 2010-09-24T16:26:52.793 に答える