- ベストアンサー
親ウィンドウのリスト値変更
やりたいこと: 親ウィンドウから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使用してます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ソースコピーしてやってみましたが駄目なようですね。 動かすだけなら 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)
あ、oが抜けてる ^^; #2です。 var newOption = opener.document.createElement('option'); です。 因みにこれでいけるのはOptionだからcreateElementで作った物を、別ウィンドウに = で入れ込めてしまえてると思います。間に合わせの方法だとブラウザのバージョンアップ等で使えなくなくなったりしますので、今後の事や他のエレメント操作のケースを考えると、#3さんの書いてくれてる、create→appendの方法を正しい方法として全体を変えておいた方が良いと思います。
- yambejp
- ベストアンサー率51% (3827/7415)
#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>
補足
setAttributeがこんなところで使えるのですね。 javascriptを最初から自分で書くのが初めてで難しいですが、 面白くてはまり気味です。 サンプルの記述ありがとうございました。 これを使っていろいろ触ってみます。 いつもありがとうございます。
- yambejp
- ベストアンサー率51% (3827/7415)
通常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>
お礼
appendを一度はじかれて使うのに抵抗がありましたが、 おっしゃる通り間に合わせの方法だと後々恐ろしいことに なりかねないですね。 IEでしか使わないシステムですが、最低限Firefoxでも使えるように しっかりした物を作ろうと思います。 詳しい説明ありがとうございました。