アプリ版:「スタンプのみでお礼する」機能のリリースについて

対象ブラウザはIE6~8です。
2つのウィンドウA/Bが連動するプログラムを作っています。

ウィンドウAにはウィンドウBを開くためのボタンがあり、
Aより先にBが開くことはありません。必ずAからBが派生します。

Aはwindow.openの戻り値を保持することで、B内部のJavaScriptにアクセスします。
Bはwindow.openerプロパティを経由することで、A内部のJavaScriptにアクセスします。

しかし、Aには自身をリロードする機能があり、
リロードすると保持していたBのウィンドウオブジェクトを失ってしまいます。
そこでAがリロードし終わったとき(onloadのタイミング)に、
何とかしてBのウィンドウオブジェクトを取得しなければなりません。

window.openではウィンドウに名前を付けることができますが、
その名前からウィンドウオブジェクトを取得するような、
document.getElementByNameみたいなメソッドは存在しないでしょうか?

あるいは、BからAの監視を続け、リロードが終わった時に
window.opener経由でメッセージを送る等の処理を実現する手段はないでしょうか?

よろしくお願い致します。

A 回答 (3件)

>あるいは、BからAの監視を続け、リロードが終わった時に


>window.opener経由でメッセージを送る等の処理を実現する
>手段はないでしょうか?
簡単なテストをしてみましたが、できないことはなさそう。
ただし、いろいろな可能性があるので、それにちゃんと対処しようとすると少々面倒そうな気が…

以下、正常な処理の場合。
1)AのunloadイベントでBの関数を呼び出す。
2)Bの関数からsetTimeoutなどでBの監視関数を呼び出す。
3)Bの監視関数はopenerのreadyStateがcompleteになるまで、自分自身をsetTimeoutなどで呼ぶ。
4)completeを確認したら、opnerの受取り用関数にB自身を引数で送る。

単純に予定通りの操作しかなければ(↑)で再取得できるみたいですが、実際は、Bが手動で閉じられていたりAが別のサイトにジャンプする(unloadイベントなので)などなどその他のケースも考えると、けっこう面倒そうです。


別のアイデアとして…
・Aから同じ名前でBを開き直せば(多分、名前を付けているでしょうから)、Bを再取得することが可能です。
・それなので、Bを開いているか否かをクッキーに保存しておいて、それを確認してAのload時にBを開くかを決めることにしてあげればよさそう。
・Bが別のサイトに遷移したりクローズされたりする場合を考えると、Bのunloadでクッキーを書きかえる。
・Bのリロードも考慮するなら、loadでクッキーへ書込む必要があり、結局は、クッキーの書込みは全てB側で行い、Aは参照するだけということになりそう。

こちらはテストしていませんので、アイデアのみです。他に問題があるかも。
いずれにしろ、面倒そうですね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
同名でwindow.openし直す、ナイスアイディアです。
お陰さまで望み通りの動作が実現できました。
細かい検証はこれからやっていきますが、大変助かりました。
ありがとうございました。

お礼日時:2011/06/21 09:16

質問タイトルの答えは

http://okwave.jp/qa/q6731947.html へ。
ただし、再読込した時点で window.b を見失うような気もしますけどね。

私なら #2 で紹介されているように window.b の open/close をどこか(CookieとかGETパラメータとか)に記憶させて、window.b を開き直します。

この回答への補足

回答ありがとうございます。
今回はASP.NETを利用しているので(今思えば先に言うべき情報でしたね、すみません
HiddenFieldを利用して「Bが開いているか」を保持させることにしました。
ありがとうございました。

補足日時:2011/06/21 09:18
    • good
    • 0

ウィンドウAをリロードさせずに、Ajaxを使って内容だけを書き換えてはどうでしょうか。

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
恐らくそれが最もスマートな方法なのだと思います。
しかし、今回は既に出来上がっているプログラムの機能追加であり、
納期の関係上、今からAjax化することが極めて困難なのです。。。

お礼日時:2011/06/20 17:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています