• ベストアンサー

親ウィンドウのリスト値変更

やりたいこと: 親ウィンドウからwindow.openで子ウィンドウを開き、 子ウィンドウのリスト値を親ウィンドウへ追加する Firefoxだと、ちゃんとできるのですが、IE7だと 『window.opener.document.resultData.sel.options[i] = newOption;』 の部分でサポートされてないプロパティまたはメソッドとエラーが出ます。 同じウィンドウでテストしてみるとちゃんと動くので、 window.openerがまずいのか [子ウィンドウ] function sendDate() { list=new Array; list[0]="apple"; list[1]="orange"; for(i=0; i<Cnt; i++){ var newOption = new Option(); newOption.text = list[i]; newOption.value = i; window.opener.document.resultData.sel.options[i] = newOption; } ※window.opener.document.resultData.sel.options[i]=new Option(list[i],list[i]);  でも同じ結果でした。 [親ウィンドウ] <form id=resultData name=resultData> <select name=sel id=sel> <option value="">--選択--</option> </select> </form> どなたか原因わかりましたら、ご伝授願います。 ※PHP、smarty使用してます。

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

  • ベストアンサー
  • arexis
  • ベストアンサー率66% (66/99)
回答No.2

ソースコピーしてやってみましたが駄目なようですね。 動かすだけなら var newOption = new Option(); を var newOption = pener.document.createElement('option'); に変更すればIEでも普通に動きます。 理由まではわかりません。 推測では opener.document.resultData.sel.options[i] = new Option() だと、コンストラクタは子ウィンドウ、HTMLは親ウィンドウになります。 IEの場合はcreateElement()なども別ウィンドウに作る時は、ウィンドウを指定してwindow名.document.createElement()にしないと使えない事からも、他のウィンドウで作ったHTMLオブジェクトはそのまま入れ込めないのかもしれませんね。文字列などのオブジェクトなら問題ないと思いますが。 コアのArrayとかだといけるんですが。。

その他の回答 (3)

  • arexis
  • ベストアンサー率66% (66/99)
回答No.4

あ、oが抜けてる ^^; #2です。 var newOption = opener.document.createElement('option'); です。 因みにこれでいけるのはOptionだからcreateElementで作った物を、別ウィンドウに = で入れ込めてしまえてると思います。間に合わせの方法だとブラウザのバージョンアップ等で使えなくなくなったりしますので、今後の事や他のエレメント操作のケースを考えると、#3さんの書いてくれてる、create→appendの方法を正しい方法として全体を変えておいた方が良いと思います。

aya_bambi
質問者

お礼

appendを一度はじかれて使うのに抵抗がありましたが、 おっしゃる通り間に合わせの方法だと後々恐ろしいことに なりかねないですね。 IEでしか使わないシステムですが、最低限Firefoxでも使えるように しっかりした物を作ろうと思います。 詳しい説明ありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

#2さんの回答をみて理解、そーいやそうだ。なので再度。 parent.htm <html> <body> <form> <select name="sel" id="sel"> <option value="">--選択--</option> </select> </form> <input type="button" value="子を開く" onClick="window.open('child.htm','','width=300,height=200')"> <div id="hoge"></div> </body> </html> child.htm <html> <head> <script> function sendData(){ var list=new Array; list[0]="apple"; list[1]="orange"; var sel=opener.document.getElementById("sel"); for(var i=0; i<list.length; i++){ var newOption=opener.document.createElement("option"); newOption.setAttribute("value",i); newOption.appendChild(opener.document.createTextNode(list[i])); sel.appendChild(newOption); } } </script> <head> <body> <form> <input type="button" value="親のセレクトに追加" onClick="sendData()"> </form> </body> </html>

aya_bambi
質問者

補足

setAttributeがこんなところで使えるのですね。 javascriptを最初から自分で書くのが初めてで難しいですが、 面白くてはまり気味です。 サンプルの記述ありがとうございました。 これを使っていろいろ触ってみます。 いつもありがとうございます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

通常selectにoptionを追加するときはoptionをcreateElementしておいて selectにappendChildするとよいようですが、IEはopenerの selectにappendすることができないようです。 なので力技で以下のようにしてみてはどうでしょう? ただもうしわけないですが、IE7は検証環境を用意していないので IE6でのみ検証しています。 parent.htm <html> <body> <form> <select name="sel" id="sel"> <option value="">--選択--</option> </select> </form> <input type="button" value="子を開く" onClick="window.open('child.htm','','width=300,height=200')"> <div id="hoge"></div> </body> </html> child.htm <html> <head> <script> function sendData(){ var list=new Array; list[0]="apple"; list[1]="orange"; var sel=window.opener.document.getElementById("sel") for(var i=0; i<list.length; i++){ sel.length++; var newOption=sel.options[sel.length -1]; newOption.value=i; newOption.text=list[i]; } } </script> <head> <body> <form> <input type="button" value="親のセレクトに追加" onClick="sendData()"> </form> </body> </html>

関連するQ&A

専門家に質問してみよう