dポイントプレゼントキャンペーン実施中!

やりたいこと:
親ウィンドウから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使用してます。

A 回答 (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とかだといけるんですが。。
    • good
    • 0

あ、oが抜けてる ^^;



#2です。
var newOption = opener.document.createElement('option');
です。

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

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

詳しい説明ありがとうございました。

お礼日時:2008/02/12 02:26

#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を最初から自分で書くのが初めてで難しいですが、
面白くてはまり気味です。

サンプルの記述ありがとうございました。
これを使っていろいろ触ってみます。
いつもありがとうございます。

補足日時:2008/02/12 02:15
    • good
    • 0

通常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>
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!