CGI-BBS > JAVA/JavaScript > JavaScript > サブwinが閉じてから親winでalert表示したい。


カレッヂ
カレッヂ


質問者 hiro  投稿日 2006/2/9(木) 13:23:30
親ウインドウでボタンを押し、サブウインドウを表示させます。
サブウインドウに表示させた「閉じる」ボタンが押されたら、サブウインドウを閉じて
親ウインドウで、alert("終了しました") のように表示させたいのですが
どうやっても サブウインドウが下に隠れてしまい、すぐにalertが表示されてしまいます。
Windowのclosedチェックをやっても間違っているのかうまくできません。
←サブウインドウが下に隠れてしまい、×でした。

onclick()で、ひとつの関数で行いたかったのですが、
openとalertの二つの関数をセットし、openしたウインドウが閉じられてから
二つ目のalert表示を行う・・・という方法でもかまいません。
どうしたらいいのでしょうか?


*****************************************
var subw;
function newWin(){
  subw =  window.open("import.html","import","width=550, height=100, location=no, menubar=no, toolbar=yes, resizable=yes");
  if(!subw || subw.closed){ 
	myno = document.form2.tbl.selectedIndex;
	str = document.form2.tbl.options[myno].value;
	alert( str + "テーブルを24件インポートしました。");
  }

}


*****************************************
親ウインドウのソース抜粋
<td align="center">
  <INPUT type="button" value="インポート" style="width:100px;height:30px" onClick="newWin()" >
</td>


*****************************************
サブウインドウのソース抜粋
<table height=100%>
<form>
<tr><td valign="middle" align="center">
  <input type="file" value="" align="center" name="text" size=70> 
  <input type="button" value="登録"  name="button"  onClick="window.close()">
</td></tr>
</table>

【習熟度】多少の設置経験

回答者 m035  [削除]  投稿日 2006/2/9(木) 20:21:46
子ウィンドウから親ウィンドウの関数を呼び出すとうまくいくと思います。
<input="button" value="閉じる" onclick="i_close()">
で以下の関数をまず子ウィンドウで呼び出します。
function i_close(){
if(!!opener&&!!opener.subw&&!opener.subw.closed){
//親ウィンドウがあり子ウィンドウを参照でき、子ウィンドウが開いている場合
opener.child_close();//親ウィンドウの関数を呼び出す
}
else{
//上記以外の場合
window.close();//仕方が無いのでただ子ウィンドウを閉じる
}
}
以上を子ウィンドウのJavaScriptに追加します。
次に、親ウィンドウのJavaScriptに以下の関数を追加します。
function child_close(){
subw.close();
window.alert("終了しました");
}
また、子ウィンドウを親ウィンドウから参照できるか調べるのに
変数subwの有無を利用するため、親ウィンドウのJavaScriptから
var subw;
を消しておいてください。
質問者 hiro  [削除]  投稿日 2006/2/10(金) 08:25:55
ありがとうございました。早速試したところ、ひとつはできました。
が、同じ処理がもうひとつ有り、うまくできません。
i_close()で//上記以外の場合→//仕方が無いのでただ子ウィンドウを閉じる・・・の
方に流れてしまいます。

変数が同じ立ちダメかと思い、変えてみても結果はダメでした。
同じようにしてるのですが、何が違うのでしょうか???
親は同じhtmlで、ボタンがたくさんあり、それぞれ子ウインドウを表示して処理をします。
申し訳ありません。よろしくお願いします。



<一つ目> →OK
●親
function dtClr(wW, wH){
 sWidth = screen.availWidth;
 sHeight = screen.availHeight;
 x = (sWidth - wW) /2;
 y = (sHeight - wH) /2;
 subw =  window.open("dataclear.html","clear","width="+wW+",height="+wH+", location=no, menubar=no, toolbar=yes, resizable=yes");
 subw.moveTo(x,y);
}
function child_close(){
 subw.close();
 parent.sys.location.href('clresult.html');
}
●子
function clr(){
 alert("クリアしました。");
 i_close();
}
function i_close(){
 if(!!opener&&!!opener.subw&&!opener.subw.closed){
  //親ウィンドウがあり子ウィンドウを参照でき、子ウィンドウが開いている場合
  opener.child_close();//親ウィンドウの関数を呼び出す
 }
 else{
  //上記以外の場合
  window.close();//仕方が無いのでただ子ウィンドウを閉じる
 }
}
◎本文
 <td colspan=2 align="center">
    <input type="button" value="クリア"  name="button"  onClick="clr()">  
    <input type="button" value="取消"  name="button"  onClick="window.close()">
 </td>

***************************************************
<<二つ目>> →NG
●親
function subWin(){
 subw1 =  window.open("import.html","imp","width=550,height=100, location=no, menubar=no, toolbar=yes, resizable=yes");
}
function child_close1(){
 subw1.close();
 myno = document.form2.tbl.selectedIndex;
 str = document.form2.tbl.options[myno].value;
 alert( str + "テーブルを24件インポートしました。");
}
●子
function ii_close(){
 if(!!opener&&!!opener.subw1&&!opener.subw1.closed){
  opener.child_close1();
 }
 else{
  //上記以外の場合 ←★★何をやっても、ここにきてしまいます。★★
  window.close();//仕方が無いのでただ子ウィンドウを閉じる
 }
}
◎本文
<tr><td valign="middle" align="center">
  <input type="file" value="" align="center" name="text" size=70> 
  <input type="button" value="登録"  name="button"  onClick="ii_close()">
</td></tr>
回答者 m035  [削除]  投稿日 2006/2/10(金) 22:00:16
function ii_close(){
 alert("openerの存在:"+!!opener);
 alert("子ウィンドウへの参照:"+!!opener.subw1);
 alert("子ウィンドウが開いているか:"+!opener.subw1.closed);
 if(!!opener&&!!opener.subw1&&!opener.subw1.closed){
  alert("opener.child_close1()が実行されます");
  opener.child_close1();
 }
 else{
  //上記以外の場合 ←★★何をやっても、ここにきてしまいます。★★
  alert("window.close()が実行されます");
  window.close();//仕方が無いのでただ子ウィンドウを閉じる
 }
}
以上の関数と既存のii_close()を置き換えて実行してみてください。
alertですべての項目がtrueになっていればopener.child_close1();は実行されています。
もしこれでもopener.child_close1()が実行されない場合は報告してください。
また、opener.child_close1()が実行されているのに親ウィンドウ側で
アラートが出ない場合は
myno = document.form2.tbl.selectedIndex;
str = document.form2.tbl.options[myno].value;
のどちらか、もしくは両方のオブジェクトの参照が出来ていない可能性があります。
関数を以下に置き換えてテストしてください。すべての項目がtrueになっていればokです。
function child_close1(){
 subw1.close();
 alert("フォームへのアクセス:"+!!document.form2);
 alert("フォーム内tblへのアクセス:"+!!document.form2.tbl);
 alert("tbl.selectedIndexの存在:"+!!document.form2.tbl.selectedIndex);
 myno = document.form2.tbl.selectedIndex;
 alert("tbl.options[myno].valueの存在:"+!!document.form2.tbl.options[myno].value);
 str = document.form2.tbl.options[myno].value;
 alert( str + "テーブルを24件インポートしました。");
}
質問者 hiro  [削除]  投稿日 2006/2/10(金) 22:16:20
ありがとうございます。
試してみたところ、1個目のalertはtrue、2個目がfalse、
3個目は、エラーになりました。
 →opener.subw1.closed はNullまたはオブジェクトではありません。
3個目は2個目がfalseなのでエラーなんですね。。。

何がいけないのでしょうか。
回答者 m035  [削除]  投稿日 2006/2/11(土) 12:22:11
ウィンドウを開くときに
変数=window.open("url","target","option");
の形で開けていない可能性があります。
エラーを恐れないなら、下記に各関数を置き換えてください。
ただし、エラー追跡用にalert()を残しておきました。

function ii_close(){
 alert("openerの存在:"+!!opener);
 if(!!opener){//親ウィンドウがあれば親の関数を実行
  alert("opener.child_close1()が実行されます");
  opener.child_close1();
 }
 window.close();
 //親ウィンドウの有無にかかわらず子ウィンドウを閉じる
}

function child_close1(){
 alert("フォームへのアクセス:"+!!document.form2);
 alert("フォーム内tblへのアクセス:"+!!document.form2.tbl);
 alert("tbl.selectedIndexの存在:"+!!document.form2.tbl.selectedIndex);
 myno = document.form2.tbl.selectedIndex;
 alert("tbl.options[myno].valueの存在:"+!!document.form2.tbl.options[myno].value);
 str = document.form2.tbl.options[myno].value;
 alert( str + "テーブルを24件インポートしました。");
}
質問者 hiro  [削除]  投稿日 2006/2/12(日) 11:23:41
親winのopen関数の方も試行錯誤していろいろ試していたのですが
書いていただいた関数に書き換えて実行したら、
結構うまくいきました。
  opener.child_close1()が実行されます
は表示されるし、
  フォームへのアクセス: true
  フォーム内tblへのアクセス : true
でしたが、
  tbl.selectedIndexの存在 : false
でした。
でも(false=0)ということで、0のindexで
  ○○テーブルを24件インポートしました
と表示されました。
何がダメだったのかわかりませんが
とりあえず見た目だけはうまく表示できました!

親ウインドウの関数を子ウインドウで操作(実行?)し、
その中で親のformのselectedを実行するのは
また別の方法になるのでしょうか?
別の質問になってしまうようですが
お尋ねしてよろしいですか?
 
やっとここまでできた感じで
本当にありがとうございます。
引き続きよろしくお願いしたいです。


回答者 m035  [削除]  投稿日 2006/2/12(日) 21:40:41
>その中で親のformのselectedを実行するのは
>また別の方法になるのでしょうか?
selectの選択項目を変更すると言うことであれば、
document.formのname.selectのname.selectedIndex=何番目を選択するか;
で出来ますので、今回なら、
document.form2.tbl.selectedIndex=i;
でtblのi番目を選択できます。

#確かに本来なら別に質問すべきですが、今回は面倒なので答えておきます・・・
質問者 hiro  [削除]  投稿日 2006/2/14(火) 09:00:28
外れた質問にもご回答いただきまして、ありがとうございました。
document.form2.tbl.selectedIndex=i;
がエラーで正しい表示ができなくて
子Winで親Winの関数を触るとそうなるのかな・・・と
思い、ついでながら・・・質問してしまいました。
すみません。
こちらの方はもう少し調べて、改めて質問したいと思います。
いろいろとありがとうございました。
まだまだ知識が足りなくて、大変勉強になりました。
またよろしくお願いいたします。

回答者 m035  [削除]  投稿日 2006/2/14(火) 23:00:23
親ウィンドウの関数内で動かすと思ったので。
子ウィンドウからなら
opener.document.form2.tbl.selectedIndex=i;
です。
質問者 hiro  [削除]  投稿日 2006/2/15(水) 09:34:16
  opener.document.form2.tbl.selectedIndex=i;
も試したのですが、
  opener.documentはNULLまたはオブジェクトではありません
のエラーになってしまうのです。
子Winの中で(?)、親Winの関数を実行する場合、親Winの関数には
自分のformの中の処理として書くのか?
callするのは子Winなので、子Winが参照できる書き方にするのか?
がわからないのです。
今のところ、どっちでもできないのですが。

似たような処理がたくさんあるので
親Winでうまくいってるところを、今回のダメな関数に書き換えて子Winの動きをみました。
ダメな方はウインドウオブジェクトの存在がなぜかfalseでしたが、
書き換えたほうではtrueでした。

でも、結局うまくいっていた方でも
 alert("フォーム内tblへのアクセス:"+!!document.form2.tbl); ←①
はtrueですが、
 alert("tbl.selectedIndexの存在:"+!!document.form2.tbl.selectedIndex); ←②
はfalseで正しく取得できませんでした。
①がtrueなのに②がfalseって どういうことなのでしょうか???

当然、親の方の別のところの処理では、②と同じ内容でIndexを取得できています。
質問者 hiro  [削除]  投稿日 2006/2/15(水) 11:45:01
解決しました!
Selectで選択した内容が子Winをオープンした時に初期値にリセットされてしまうのと
そのままの内容で子Winが表示される・・・という違いに気がつきました。
で、申し訳ありません。
親のほうの<INPUT・・・ のTYPEが途中でsubmitになっていたようです。試行錯誤の試験の残骸でした。
それによって、どうしてもselectで別のを選んでも初期値のものしか
表示できなかったようです。

selectIndexは、相変わらずfalseですが、これは選択時のIndexが
「0(番目)」の場合falseになるみたいです。
別のをselectして実行したら ちゃんとtrueになり、結果表示も
正しくできました。

m035様、本当に長い間ありがとうございました。
途中で自分で招いたsubmitに気づかずに、別の問題として質問してしまいましたが
ご親切に対応していただき、感謝します。
今後ともよろしくお願いいたします。
ありがとうございました。

このページは終了したので返信(回答)は書きこめません
 


Web裏技