
以下の操作をした際に親ウインドウの情報を取得できず困っています。
1.親ウインドウでサブウインドウを開く
2.サブウインドウのボタン押下で親ウインドウのlocationを変更する
3.サブウインドウから「window.opener」を使おうとすると、object自体は存在するがnameやdocumentが取得できない
サブウインドウが開いている間に親ウインドウを変更するとopenerは情報を失うのでしょうか?
やりたいことはサブウインドウから親ウインドウのアドレスを変更し、hiddenに値をセットしたいのですが、対応策はありますでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
隠しフレームを用意します。
親ウインドウを開く際、隠しフレームのjavascriptから開くようにします。
子ウインドウも開く際、隠しフレームのjavascriptから開くようにします。
子から親ウインドウを更新する場合は、隠しフレームのjavascriptで更新をかけます。
また、hiddenに値を入れる際にも隠しフレームのjavascriptで、、。
こんな感じでやれば、出来ると思います。
ちなみに隠しフレームって、0ピクセルのフレームの事です。
この回答への補足
回答ありがとうございます。
元々親ウインドウはフレーム分割されていて(Aフレーム、Bフレーム)、
Aフレーム上のボタン押下でBフレームに定義したjavascriptを呼び出したのですがうまくいきませんでした。
opener.nameを表示したところ「Aフレーム」となってしまうことから、
javascriptの定義している場所ではなく、アクションを起こしたフレームがopenerとなるようです。
何か良い方法はないでしょうか?
No.6
- 回答日時:
すいません。
No5の件無視してください。
こちらのまったくの勘違いです。(==;
いま、テストして、何を問題にしているか分かりました。
window.opener.parent.location = "http://yahoo.co.jp/";
とやらずに
window.open("http://yahoo.co.jp/", "right","");
こんな記述で書いてください
ううう、No5消したいよお、(T-T;
たびたびの回答ありがとうございました。
おかげさまで問題は解決しました。
openerが無効になる原因は、サブウインドウでopener.parent.locationを変更したことにより
opener自体を操作できなくなるためだったようです。
(親オブジェクトを変えると子オブジェクトにアクセスできないため?)
No.1でアドバイスしていただいた「隠しフレームのjavascriptからサブウインドウを開く方法」
に少し手を加えたらうまくいきました。
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を書き換える事の無い画面」
が最低条件になります。
No.4
- 回答日時:
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が変わりません。
ロードはしているようなのですが・・・。
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/
この回答への補足
Aフレーム、Bフレームともに親ウインドウの分割されたフレームです。
「openしたもの」は質問の中ではサブウインドウと呼んでいます。
No.2
- 回答日時:
書き忘れていましたが、
その現象はセキュリティのためのブラウザ仕様です。
一番下の注意事項。読んでください。
http://www.marguerite-site.com/Nihongo/HowToMake …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スマホ上で、左右スワイプで次...
-
ブラウザのURLアドレス文字表記...
-
submitボタンで他のフレームを...
-
ボタンのID名を取得するには?
-
<a href="#" …>の意味を教えて...
-
親タブから子タブ開いて親タブ...
-
テキストボックス内にハイパー...
-
bodyにidをつける理由は何ですか?
-
小窓を表示する時に、必ず右上...
-
processing
-
iflameのスクロールバーについて
-
javascriptでalertの文字列をコ...
-
ランダムにページにアクセスしたい
-
ステータスバーにリンクのURLを...
-
あなたのXAMPPのdashboard内のj...
-
javascript 初心者です 引数...
-
htmlファイルを開いた時の画面...
-
ハイパーリンクに下線を表示す...
-
<div>のタッチ状態を維持したま...
-
SCRIPT5007: 未定義または NULL...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スマホ上で、左右スワイプで次...
-
別ページのインラインフレーム...
-
インラインフレームで表示され...
-
別フレームの中にあるインライ...
-
showModalDialog()による新規ウ...
-
openerは使えないのでしょうか?
-
プルダウンメニューをフレーム...
-
フレームを跨ぐドロップダウン...
-
フレームで隠れるポップ
-
親ウィンドウの別フレームを子...
-
フレームでの右クリック禁止
-
URLを引数とし、フレーム間で渡...
-
Safariで<iframe>のinnerHTMLを...
-
インラインフレームをドラッグ...
-
子フレームの自動リロードは可...
-
HTMLでサブフレームから親のス...
-
チェックボックスのチェックを...
-
HTMLフォームボタンによるター...
-
JavaScript フレーム内のイン...
-
フレームを分けたときに共通で...
おすすめ情報