• ベストアンサー

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

  • ラジオボタンクリックでサブウインドウを閉じる

    サブウインドウのラジオボタンを押したときに親ウインドウにテキストをインプットしていますが、このとき、自動的にサブウインドウを閉じるにはclose()を使うのかと思いますが、どのように追加したら良いでしょうか。 <INPUT TYPE="radio" NAME="myRB" onClick="window.opener.document.myFORM.address.value='やっほ'">やっほ

  • javascriptのopenerでエラー

    naritanと申します。 現在、ファイルのアップロード機能を作成しております。 親ウィンドウから子ウィンドウを開いて、開いた子ウィンドウでアップロードするファイルを選択し、ボタンを押下時にcgiを実行して実現しています。 そこで、子ウィンドウでボタンを押下した時に、選択したファイルの名前を親ウィンドウに表示したいと思い、ボタン押下時にまず、javascriptに処理を移し、openerメソッドを使用して実現しようとしているのですが、「アクセスが拒否されました」というjavascriptのエラーが表示されてしまいます。 記述は以下のようにしています。 -------------------------------------------------- window.opener.document.FORM1.file_nm.value = str2; -------------------------------------------------- ※str2:ファイル名保持変数 ※file_nm:親ウィンドウFORM1上のテキストボックス名 ちなみに親ウィンドウと子ウィンドウの拡張子は異なっているので、ためしに拡張子を合わせて実行してみたところ、ファイル名は親ウィンドウに表示されたのですが、cgiが動かなくなってしまいました。 ちなみに親ウィンドウはhtsファイル、子ウィンドウはhtmlファイルです。 お分かりになる方が見えましたら、ご教授願います。

  • javascriptにphpの変数を用いる

    JavaScriptでサブウインドウのフォームから親ウインドウのフォームにデータを送るプログラムを書いています。 親ウインドウのページによって処理を変えているのですが、phpの変数を使うと関数自体がエラーになってしまいます。 どう書くのが正しいのでしょうか?教えてください。 プログラムは下記です。 if(page=="0"){ window.opener.document.form_name.input_name.value=input_data; window.close(); } else{   for(i=1; i<6; i++){     var pagename = "page_"+i;     if(page == pagename){ window.opener.document.<?php echo $_GET[form_name]; ?>.<?php echo $_GET[input_name]; ?>.value=input_data; window.close();   } }

  • サブウインドウで親画面の情報を取得

    以下のことが可能なのか質問いたします。 (1) 親画面のボタンをクリック (2) サブウインドウを開く (3) サブウインドウのオンロード時に呼ばれるJavaScript内で親画面の情報を取得 (4) 取得した情報をJspの変数に格納 オンロード時に呼ばれるJavaScript------------ function GetCode(){ <%=inputCode%>=window.opener.document.forms[0].elements[0].value; } ------------------------------------------ Jspの生成の後にオンロードされる(?)ので、ひょっとしてできないのでしょうか。

  • 親フォームのHiddenに子フォームから設定は可能ですか?

    標記の通り、opener.windowにて、親フォームと子フォームを関連付けし、 子フォームで値を入力、close.windowをする際に親フォームのtextfield等に値を設定しております。 その後、設定された値を用いて、親フォームから登録処理等を行っています。 その際に、textFieldには問題なく値がセットされるのですが、どうもHiddenにはセットされていないようです。 そもそもTextfieldも、ソースを見る限りでは内容は書き換わっておりませんでした。 やはり見た目上でのみ設定され、ソース自体はまったく変わらない。 =ソース上でのみ存在するHiddenの値を、JavaScriptで変更することは不可能、という事なのでしょうか? ------------------------------ //親フォームと関連付け function LoadSet(){  oya_win = opener.window; } //フォームclose時に値をセット function oyaMsgSet(){  oya_win.document.フォーム名.elements['Hidden_Name[]'][cnt].value = "1";←ダメ  oya_win.document.フォーム名.elements['Txt_Name[]'][cnt].value = "設定値"←OK }

  • Firefoxでvalueの値を変更できない

    フォームの値を通常 <input name="Reload" type="hidden" value="1" id="Reload" /> で飛ばしていますが、サブウィンドウで操作後識別のために window.opener.document.getElementById('Reload').value=2 と値を変更するようにしていました。 しかし、IE6では動くのですがFirefoxでは値が変更できずに悩んでいます。 良い解決法があればよろしくお願いいたします。

  • 親ウィンドウのフォームの値を変更

    showModalDialogでオープンした子画面から、returnValueで値を返すのとは違う方法で、親ウィンドウのフォームの値を変更したいと思っています。 (その子画面をオープンすると同時に、親ウィンドウのフォーム値を変更したいため) その際に    window.opener.document.formA.hiddenA.value = "aaa" という風に記述しているのですが、「window.opener.documentはオブジェクトではありません」というエラーになってしまいます。window.openで開いた子画面からだと、この方法でできたと思うのですが・・・どうすれば変更できるでしょうか?そもそも、showModalDialogでオープンした画面から親ウィンドウの値を変更すること自体がダメなのでしょうか? よろしくお願いします。

  • IE8のwindow.opener.location.href動作について

    宜しくお願い致します。 IE8のjavascript「window.opener.location.href」の動作がIE7から変わった様で、思い通りの動作をしなくなりました。 1、WEBサーバ側の親ウィンドウからWinXPにインストールしたローカルサーバ側のPHPスクリプトへwindow.openで子ポップアップウィンドウを開きます。 2、ローカルサーバ側の子ポップアップウィンドウで特定のプログラムを走らせ、WEBサーバ側の親ウィンドウへローカルサーバ側の子ポップアップウィンドウからwindow.opener.location.hrefで、親ウィンドウの表示ページを切り替える。 という動作をしていたのですが、IE8にアップデートしたら、ローカルサーバ側の子ウィンドウからWEBサーバ側のURLを切り替えると、別ウィンドウで開いてしまい、親ウィンドウが2ページに分かれます。 さらに、元の親ウィンドウはURLが変更にならず、新しく開いたページのURLだけ変わっています。 この動作をIE7と同じ様に、子ウィンドウから元の親ウィンドウのURLを変更させるにはどうすればよいのでしょうか?

  • window.openerが設定出来ません。

    よろしくお願い致します。 親のページ(メインフレームのページ)から子ウィンドウを呼び出すことは出来るのですが、子ウィンドウから親ページを操作しようとすると、 Not Found The requested URL /test/mf_a.html/ was not found on this server. と出てしまいます。 子のスクリプトは以下の様になっています。 <!-- function aaa(){ window.opener.location.href="http://www.xxx.co.jp/test/mf_a.html/"; } function closeWin(){ if(opener.closed == false){ window.opener.close(); } window.close(); } //--> となり・・・ <img src="/test_img/shin.gif" width="150" height="53" border="0" onClick="aaa()" > を押すと親ページ(フレームのメイン)が切り替わるはずなんですが、うまくいきません。 親と子は同じ階層にいます。 どこがおかしいのでしょうか? 親が子を呼び出すときのスクリプトに問題があるのでしょうか? 教えてください。 よろしくお願い致します。

  • Firefoxでwindow.openerが動作しない

    あるHTMLから、window.openであらたなウィンドウを開いて、開いたウィンドウにあるリンクをクリックすると、そのリンクの値が元のウィンドウのテキストフォームに入力されるようにしたいのです。 IE6では正常に動いてくれますが、Firefox3で動きません。 新たなウィンドウでは以下の記述をしています。 function junp(value){ window.opener.formtest["test"].value = value; window.close(); } window.openerの行をコメントアウトすると正常にウィンドウを閉じます。 そもそもFirefoxでwindow.openerは使えないのでしょうか??

専門家に質問してみよう