電子書籍の厳選無料作品が豊富!

以下の操作をした際に親ウインドウの情報を取得できず困っています。
1.親ウインドウでサブウインドウを開く
2.サブウインドウのボタン押下で親ウインドウのlocationを変更する
3.サブウインドウから「window.opener」を使おうとすると、object自体は存在するがnameやdocumentが取得できない

サブウインドウが開いている間に親ウインドウを変更するとopenerは情報を失うのでしょうか?

やりたいことはサブウインドウから親ウインドウのアドレスを変更し、hiddenに値をセットしたいのですが、対応策はありますでしょうか?

よろしくお願いします。

A 回答 (6件)

隠しフレームを用意します。


親ウインドウを開く際、隠しフレームのjavascriptから開くようにします。
子ウインドウも開く際、隠しフレームのjavascriptから開くようにします。
子から親ウインドウを更新する場合は、隠しフレームのjavascriptで更新をかけます。
また、hiddenに値を入れる際にも隠しフレームのjavascriptで、、。
こんな感じでやれば、出来ると思います。

ちなみに隠しフレームって、0ピクセルのフレームの事です。

この回答への補足

回答ありがとうございます。
元々親ウインドウはフレーム分割されていて(Aフレーム、Bフレーム)、
Aフレーム上のボタン押下でBフレームに定義したjavascriptを呼び出したのですがうまくいきませんでした。
opener.nameを表示したところ「Aフレーム」となってしまうことから、
javascriptの定義している場所ではなく、アクションを起こしたフレームがopenerとなるようです。
何か良い方法はないでしょうか?

補足日時:2005/10/12 15:48
    • good
    • 0

すいません。


No5の件無視してください。
こちらのまったくの勘違いです。(==;
いま、テストして、何を問題にしているか分かりました。

window.opener.parent.location = "http://yahoo.co.jp/";
とやらずに
window.open("http://yahoo.co.jp/", "right","");
こんな記述で書いてください

ううう、No5消したいよお、(T-T;
    • good
    • 0
この回答へのお礼

たびたびの回答ありがとうございました。
おかげさまで問題は解決しました。

openerが無効になる原因は、サブウインドウでopener.parent.locationを変更したことにより
opener自体を操作できなくなるためだったようです。
(親オブジェクトを変えると子オブジェクトにアクセスできないため?)

No.1でアドバイスしていただいた「隠しフレームのjavascriptからサブウインドウを開く方法」
に少し手を加えたらうまくいきました。

お礼日時:2005/10/13 15:02

説明が足りなかったみたいですね(--;


その原因は、セキュリティによるものです。

No2のサイトにも書いていますが。
>window.openプロパティで開いたウインドウでリンクなどで別のリソースを表示させた後に
>window.openerオブジェクトを使おうとするとセキュリティエラーが生じます。
>window.openで開いたウインドウでwindow.openerを利用する場合は、
>そのウインドウでリンクなどを利用しないで下さい。


具体的にはNo4の
opener.parent.location = "http://yahoo.co.jp/";
この行以降から、openerは無効になります。

理由は簡単です。
これを許してしまうと

opener.parent.location = "どっかのアタックしたい、ショッピングサイトA";
opener.parent.xx = (...でアクセス可能な場合)
以降、自分側のhtml書き換えれば、
サイトAのセッション情報、クッキー情報読み放題、書き換え放題(-▽-
Submit、スクリプト動かし放題。(-▽-♪
うまくいきゃあ、他人のユーザで買い物し放題(=▽=♪♪♪

のような事になってしまいます。


ついでに書いときますが、
openerは他にも、
「親とサイトが違う場合はアクセス不可」
って制約があります。

で、No1から言っている、
隠しフレームとは、
「すべての画面の親であり」、
「子画面からURLを書き換える事の無い画面」
が最低条件になります。
    • good
    • 0

No3の書き込み、読み直すと、ちとキツイ書き方してますね、、。

すいません。
ちと、忙しくなっちゃたんで(=w=;
(忙しいのにカキコしてる事は、突っ込まないでね、)

この回答への補足

お忙しいのにありがとうございます。

簡略化したソースを載せます。(分かりやすくするため、質問の内容とは若干異なりますがご容赦ください)

親ウインドウ
 +フレーム名:top
 └フレーム名:under

サブウインドウ
 +ボタン1:testScript(1)
 └ボタン2:testScript(2)

function testScript(argKbn) {
 if(argKbn == 1)
  opener.parent.location = "http://yahoo.co.jp/";
 if(argKbn == 2)
  opener.parent.location = "http://www.vector.co.jp/";
}
サブウインドウにある2つのボタンを順番に押すと、1つめはurlが変わるのですが、2つめではurlが変わりません。
ロードはしているようなのですが・・・。

補足日時:2005/10/12 19:38
    • good
    • 0

>元々親ウインドウはフレーム分割されていて(Aフレーム、Bフレーム)、


>Aフレーム上のボタン押下でBフレームに定義したjavascriptを呼び出したのですがうまくいきませんでした。
>opener.nameを表示したところ「Aフレーム」となってしまうことから、
>javascriptの定義している場所ではなく、アクションを起こしたフレームがopenerとなるようです。

一応、確認ですが、Aフレームは、Bフレームの処理でopenしたものでしょうか?
そうしなければ、Aフレームのopenerは、Bにならないので、。

後、別にopener使わなくても、別フレームにアクセス可能のはずですが。
こんな感じで
http://www.openspc2.org/kouza_js/082/

この回答への補足

Aフレーム、Bフレームともに親ウインドウの分割されたフレームです。

「openしたもの」は質問の中ではサブウインドウと呼んでいます。

補足日時:2005/10/12 19:41
    • good
    • 0

書き忘れていましたが、


その現象はセキュリティのためのブラウザ仕様です。

一番下の注意事項。読んでください。
http://www.marguerite-site.com/Nihongo/HowToMake …
    • good
    • 0

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