- PR -

ウインドウ操作について

投稿者投稿内容
NAO
ベテラン
会議室デビュー日: 2003/09/24
投稿数: 51
投稿日時: 2003-09-24 17:18
ASP.NETにて親ウインドウのイベントで子ウインドウを
削除したいのですが、どのようにすれば実現可能なのでしょうか?
親ウインドウのCSファイルに下記イベントを記述し実行したのですが、
動作いたしませんでした。

※new_window(子ウインドウ名)
//クライアント側でリロード処理を記述(javascript)
 StringBuilder MyStringBuilder = new StringBuilder();
 
 MyStringBuilder.Append("<script language='javascript'>\n");
 MyStringBuilder.Append("new_window.close()\n");
 MyStringBuilder.Append("</script>");

//上記記述のJavaScriptのロード実行箇所
 RegisterClientScriptBlock("del",MyStringBuilder.ToString());

ご教授宜しくお願い致します。
NYRL
ベテラン
会議室デビュー日: 2003/07/14
投稿数: 90
投稿日時: 2003-09-24 17:33
子ウインドウの作成部分が分からないのですが
基本的に子は親を知っていますが親は子を知りません。

ですので子を作成した時に覚えておかないと操作できません。

でここからはJavascriptになりますが単純には
var ko = window.open(子)
と開き

ko.close();

とやると閉じます。

・・・が間にサーバーへの遷移が入ると ko の参照がなくなるので操作できなくなります。

で親が閉じられた場合に子を閉じたいのであればこれでもいけますが
それ以上のこと(子は表示したまま親を色々操作して最後に子を消す)をやろうとすると
フレームを使用してフレーム側にこの参照を持つ必要があります。
NAO
ベテラン
会議室デビュー日: 2003/09/24
投稿数: 51
投稿日時: 2003-09-24 18:34
ご回答有難うございます。

親ウインドウが子ウインドウを認識しないというのは理解いたしました。
また、子ウインドウの作成箇所はこの様に記述しています。
Tree_B.Attributes["onclick"] = "window.open(子);";

それでもう一つご質問なのですが、

<それ以上のこと(子は表示したまま親を色々操作して最後に子を消す)をやろうとすると
<フレームを使用してフレーム側にこの参照を持つ必要があります。

というフレームを使用するとは、どのような方法になるのでしょうか?
Tree_B.Attributes["onclick"] = "var ko = window.open(子);";
と記述しても、値を保持できなかったので、このフレーム参照が必要になるのかと
考えております。
よろしくお願い致します。
ぴで
大ベテラン
会議室デビュー日: 2002/10/10
投稿数: 123
お住まい・勤務地: 東京
投稿日時: 2003-09-25 02:16
以下のような感じで子画面制御用の隠しフレーム(height=0)を
ワンクッションかませることで、隠しフレームに子画面の参照を
保持しておくようにすれば、親(?)画面が消えても子画面の制御が可能です。

windowsアプリケーションではないので、こういったウィンドウ制御は面倒ですが。。。
コード:
--------------------
○制御用隠しフレーム
var ko;
function OpenChileWindow(){
  ko=window.open(...);
}
function CloseChileWindow(){
  ko.close();
}
--------------------
○親フレーム
子画面開く時:top.frames("frameControl").OpenChileWindow();
子画面閉じる時:top.frames("frameControl").CloseChileWindow();
--------------------

NAO
ベテラン
会議室デビュー日: 2003/09/24
投稿数: 51
投稿日時: 2003-09-26 15:12
返信遅くなって申し訳ありません。
びでさん回答有難う御座います。

親画面を表示時にダミーフレームから表示させる
という方法は理解いたしました。
それで、実際に構築してみたのですが、親画面に記述
してある下記コードでエラーとなってしまいます。

top.frames("?").OpenChileWindow();

?とは、どの名前を定義すればよろしいのでしょうか?
親フレーム名ではないかとは思いますが、
<frameset>にnameはつけられず、悩んでおります。
ちなみにidを定義して?に定義したのでしたがダメでした。
宜しくお願い致します。

---------------ダミーフレームコード
<html>
<head>
 <script language="javascript">
 //--------------------
 //○ウインドウ制御用隠しフレーム 
 var ko;

 function OpenChileWindow(){
  ko=window.open("");
 }

 function CloseChileWindow(){
  ko.close();
 }
 //--------------------
 </script>
</head>
  <frameset>
   <frame name="Main" src="親画面URL">
  </frameset>
</html>

ぴで
大ベテラン
会議室デビュー日: 2002/10/10
投稿数: 123
お住まい・勤務地: 東京
投稿日時: 2003-09-29 00:35
引用:
親画面を表示時にダミーフレームから表示させる
という方法は理解いたしました。
それで、実際に構築してみたのですが、親画面に記述
してある下記コードでエラーとなってしまいます。

top.frames("?").OpenChileWindow();

?とは、どの名前を定義すればよろしいのでしょうか?
親フレーム名ではないかとは思いますが、
<frameset>にnameはつけられず、悩んでおります。
ちなみにidを定義して?に定義したのでしたがダメでした。
宜しくお願い致します。

ちょっと違います。
制御用のページを高さ0で作り、その中に関数を用意してやります。

---------------ダミーフレームコード
<html>
  <frameset rows="0,*">
   <frame name="Control" src="制御用ダミーフレーム">
   <frame name="Main" src="親画面URL">
  </frameset>
</html>

---------------制御用フレームコード
<html>
<head>
 <script language="javascript">
 //--------------------
 //○ウインドウ制御用隠しフレーム 
 var ko;

 function OpenChileWindow(){
  ko=window.open("");
 }

 function CloseChileWindow(){
  ko.close();
 }
 //--------------------
 </script>
</head>
<body></body>
</html>

としてやれば、
top.frames("Control").OpenChileWindow();
のように呼び出せます。
NAO
ベテラン
会議室デビュー日: 2003/09/24
投稿数: 51
投稿日時: 2003-09-29 15:27
びでさん、ご回答ありがとうございます。

フレームを使用したウィンドウ制御方法は理解致しました。
細かい説明、ありがとうございました。

それで実際に構築してみたのですが、またまた質問したいことが
出てきました。

前にNYRLさんのご回答の中に

<それ以上のこと(子は表示したまま親を色々操作して最後に子を消す)をやろうとすると
<フレームを使用してフレーム側にこの参照を持つ必要があります。

との記述があり、私の場合フレームにて参照を持つ必要があるとの判断をしました。
ですが、子ウインドウから親ウインドウ(Main.aspx)のリロード処理を行った後に
top.frames("Control").OpenChileWindow(); を呼出すと、
「Microsoft JScript 実行時エラー: オブジェクトでサポートされていないプロパティまたはメソッドです。」
とtop自体も無くなってしまったようなエラーとなってしまいます。

下記コードの例でDummy.htmのリロードではなく、Main.aspxのリロードなのに
参照を保持しないのは、一体どのあたりがマズイのでしょうか?
たびたび質問ですみませんが宜しくお願い致します。

※Main.aspxのリロード処理を行わない場合はエラーとはならず、クローズ処理が可能でした。

-------ダミーフレームコード(Dummy.htm)
<html>
  <frameset rows="0,*">
   <frame name="Control" src="Control.htm">
   <frame name="Main" src="Main.aspx">
  </frameset>
</html>
-----------------------------------
ぴで
大ベテラン
会議室デビュー日: 2002/10/10
投稿数: 123
お住まい・勤務地: 東京
投稿日時: 2003-09-29 17:32
引用:
ですが、子ウインドウから親ウインドウ(Main.aspx)のリロード処理を行った後に
top.frames("Control").OpenChileWindow(); を呼出すと、
「Microsoft JScript 実行時エラー: オブジェクトでサポートされていないプロパティまたはメソッドです。」
とtop自体も無くなってしまったようなエラーとなってしまいます。

考えられる原因
  1. 子画面からの呼出しがopener.CloseChildWindow();のようにopenerを使っていない。
  2. Main.aspxをリロードしているつもりが、opener.location.reload();と書いていて
    実は制御用フレームをリロードしている。
  3. OpenChileWindow();のスペルが違っている。
    OpenChildWindowかな。私のサンプルが違ってました。
恐らくコードのミスだと思いますので、
<frameset rows="100,*"> ← 見えるようにして
<frame name="Control" src="Control.htm"> にalert表示ボタンを埋め込むなどして
1ステップずつデバッグしてみてください。

スキルアップ/キャリアアップ(JOB@IT)