• ベストアンサー

openerは使えないのでしょうか?

以下の操作をした際に親ウインドウの情報を取得できず困っています。 1.親ウインドウでサブウインドウを開く 2.サブウインドウのボタン押下で親ウインドウのlocationを変更する 3.サブウインドウから「window.opener」を使おうとすると、object自体は存在するがnameやdocumentが取得できない サブウインドウが開いている間に親ウインドウを変更するとopenerは情報を失うのでしょうか? やりたいことはサブウインドウから親ウインドウのアドレスを変更し、hiddenに値をセットしたいのですが、対応策はありますでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • akanekor
  • ベストアンサー率52% (102/194)
回答No.1

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

wo-007
質問者

補足

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

その他の回答 (5)

  • akanekor
  • ベストアンサー率52% (102/194)
回答No.6

すいません。 No5の件無視してください。 こちらのまったくの勘違いです。(==; いま、テストして、何を問題にしているか分かりました。 window.opener.parent.location = "http://yahoo.co.jp/"; とやらずに window.open("http://yahoo.co.jp/", "right",""); こんな記述で書いてください ううう、No5消したいよお、(T-T;

wo-007
質問者

お礼

たびたびの回答ありがとうございました。 おかげさまで問題は解決しました。 openerが無効になる原因は、サブウインドウでopener.parent.locationを変更したことにより opener自体を操作できなくなるためだったようです。 (親オブジェクトを変えると子オブジェクトにアクセスできないため?) No.1でアドバイスしていただいた「隠しフレームのjavascriptからサブウインドウを開く方法」 に少し手を加えたらうまくいきました。

  • akanekor
  • ベストアンサー率52% (102/194)
回答No.5

説明が足りなかったみたいですね(--; その原因は、セキュリティによるものです。 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を書き換える事の無い画面」 が最低条件になります。

  • akanekor
  • ベストアンサー率52% (102/194)
回答No.4

No3の書き込み、読み直すと、ちとキツイ書き方してますね、、。すいません。 ちと、忙しくなっちゃたんで(=w=; (忙しいのにカキコしてる事は、突っ込まないでね、)

wo-007
質問者

補足

お忙しいのにありがとうございます。 簡略化したソースを載せます。(分かりやすくするため、質問の内容とは若干異なりますがご容赦ください) 親ウインドウ  +フレーム名: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が変わりません。 ロードはしているようなのですが・・・。

  • akanekor
  • ベストアンサー率52% (102/194)
回答No.3

>元々親ウインドウはフレーム分割されていて(Aフレーム、Bフレーム)、 >Aフレーム上のボタン押下でBフレームに定義したjavascriptを呼び出したのですがうまくいきませんでした。 >opener.nameを表示したところ「Aフレーム」となってしまうことから、 >javascriptの定義している場所ではなく、アクションを起こしたフレームがopenerとなるようです。 一応、確認ですが、Aフレームは、Bフレームの処理でopenしたものでしょうか? そうしなければ、Aフレームのopenerは、Bにならないので、。 後、別にopener使わなくても、別フレームにアクセス可能のはずですが。 こんな感じで http://www.openspc2.org/kouza_js/082/

wo-007
質問者

補足

Aフレーム、Bフレームともに親ウインドウの分割されたフレームです。 「openしたもの」は質問の中ではサブウインドウと呼んでいます。

  • akanekor
  • ベストアンサー率52% (102/194)
回答No.2

書き忘れていましたが、 その現象はセキュリティのためのブラウザ仕様です。 一番下の注意事項。読んでください。 http://www.marguerite-site.com/Nihongo/HowToMakeYourWeb/JavaScript/OperateNewWindow.html#top

関連するQ&A