C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: window.openのdependentスタイルについて


(過去ログ 40 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■20784 / inTopicNo.1)  window.openのdependentスタイルについて
  
□投稿者/ hana (22回)-(2008/06/16(Mon) 13:08:39)

分類:[.NET 全般] 

いつもお世話になっております。

「親ウィンドウが閉じた時に子ウィンドウも閉じる」の処理を行いたく、
window.openにdependent=yesを指定したのですが、動作しませんでした。
調べてみたらNN4以上にしか対応していないためでした。
IEでの方法はないのでしょうか?
また、親ウィンドウが遷移した場合も子ウィンドウを閉じたいと思っています。

検索して下記を見つけたのですが、回答のページがService Unavailableで見れませんでしたので
こちらで質問させて頂きました。
http://www.tohoho-web.com/lng/199908/99080049.htm

実現方法をご存知の方、ご教授をよろしくお願い致します。

【開発環境】
Visual Basic .NET 2003
Webフォーム
言語:VB

引用返信 編集キー/
■20793 / inTopicNo.2)  Re[1]: window.openのdependentスタイルについて
□投稿者/ ネタ好き (451回)-(2008/06/16(Mon) 17:20:04)
No20784 (hana さん) に返信
親Webフォームのクローズイベントを子フォームで受け取って自身で閉じたらいいと思います。
引用返信 編集キー/
■20805 / inTopicNo.3)  Re[2]: window.openのdependentスタイルについて
□投稿者/ ま (52回)-(2008/06/16(Mon) 22:55:49)
var oya = {
  push:function(wKo) {
     this.arr.push( wKo );
  },
  arr:[],
  closeAll:function() {
     for (var w in this.arr) {
        if (w && w.closed == false) w.close();
     }
  },
  init:function() {
     var oThis = this;
     window.onbeforeunload = function() {
         oThis.closeAll();
     }
  }
};

親の初期化

oya.init();


子の初期化

window.opener.oya.push( window );

これで、親を閉じたら開いている子が全部閉じます。

引用返信 編集キー/
■20809 / inTopicNo.4)  Re[3]: window.openのdependentスタイルについて
□投稿者/ hana (23回)-(2008/06/17(Tue) 08:58:47)
ネタ好きさん、まさん、ご返信ありがとうございます。

まさん、具体的にコードを書いて頂きまして
本当にありがとうございます。

ただ、私はJavaScriptを全くやったことが無いので
まさんの書いて頂いたコードの意味が殆ど分かりません。
本当に申し訳ありません。

まさんの書いて頂いたコードを元に
色々調べて、理解をしたいと思っております。

*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*
また、自分なりに調べてちょっとやってみたのと
同じような処理がありましたのでURLを載せておきます。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=17932&forum=7
*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*

【私が実現したいこと】
@親ウィンドウが閉じられたら子ウィンドウも閉じる
A親ウィンドウが遷移したら子ウィンドウを閉じる

【作成した処理】
@については未着手

Aについて、以下の処理を作成
→1)子ウィンドウを開く処理部分で、セッションに開いた情報を持たせる
    --------------------------------------------------------------
  ある、ボタン押下関数内
  Session("WinOpen")=True

  Dim jscript As String
  jscript &= "<script language=javascript>"
  jscript &= "window.open('子画面.aspx','Win','height=600,width=400,…省略…');"
  jscript &= "</script>"
  Response.Write(jscript)
  --------------------------------------------------------------

 2)親ウィンドウの遷移先のPage_Load関数内でSession("WinOpen")がTrueなら
  子ウィンドウと同じ名前でブランク画面(座標指定で小さい画面)を開き、子ウィンドウを閉じる
 ※上記サイトにも書かれているのですが、親ウィンドウに遷移前に子ウィンドウが閉じられた場合、
  画面が若干ガチャガチャするのです(読み込み処理のため?)
  (子ウィンドウが閉じられたという情報を取得したいのですが、方法がわかりません…)
  --------------------------------------------------------------
  親ウィンドウの遷移先のPage_Load関数内
  If Session("WinOpen")=True Then
    Dim jscript As String
    jscript &= "<script language=javascript>"
    jscript &= "var win = window.open('','Win','height=0,width=0');"
    jscript &= "win.close();"
    jscript &= "</script>"
    Response.Write(jscript)
    Session("WinOpen")=False
  End If
  --------------------------------------------------------------

Aの処理について最適な方法がありましたら、教えて下さい。
長くなってしまったので読むのが億劫かもしれませんが、どうぞよろしくお願い致します。

引用返信 編集キー/
■20833 / inTopicNo.5)  Re[4]: window.openのdependentスタイルについて
□投稿者/ ま (53回)-(2008/06/17(Tue) 22:45:34)
No20809 (hana さん) に返信
> ネタ好きさん、まさん、ご返信ありがとうございます。
> 
> まさん、具体的にコードを書いて頂きまして
> 本当にありがとうございます。
> 
> ただ、私はJavaScriptを全くやったことが無いので
> まさんの書いて頂いたコードの意味が殆ど分かりません。
> 本当に申し訳ありません。
> 
> まさんの書いて頂いたコードを元に
> 色々調べて、理解をしたいと思っております。

やる気があって良かったです。

oya.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD> 
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE></TITLE>
<script>
var oya = {
  push:function(wKo) {
  	alert("この子を [" + wKo + "] 登録すんぞ〜");
     this.arr.push( wKo );
  },
  arr:[],
  closeAll:function() {
  	alert("子を閉じるぞ[" + this.arr.length);
     for (var x=0;x < this.arr.length;x++) {
     	var w = this.arr[x];
     	alert(" この子は " + w + "  微妙かな?");
        if (w && w.closed == false) w.close();
     }
  },
  init:function() {
     var oThis = this;
     window.onbeforeunload = function() {
     	alert("閉じられるぞー");
         oThis.closeAll();
     }
  }
};
window.onload = function() {
	oya.init();
}
</script>

</HEAD>
<BODY>
<input type=button onclick="javascript:window.open('ko.html','ko','width=100,height=100')" value="komado">


</BODY>
</HTML>

ko.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD> 
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE></TITLE>
<script>

window.opener.oya.push( window );

</script>
</HEAD>
<BODY>


</BODY>
</HTML>



> 
> *〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*
> また、自分なりに調べてちょっとやってみたのと
> 同じような処理がありましたのでURLを載せておきます。
> http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=17932&forum=7
> *〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*

全然見当はずれです。


> 
> 【私が実現したいこと】
> @親ウィンドウが閉じられたら子ウィンドウも閉じる
> A親ウィンドウが遷移したら子ウィンドウを閉じる

上に提示したスクリプトが要件としてあっているかと。
詳細は、onbeforeunload イベントを見てください。
JavaScript は、親が子を管理するのは、「子があれば」というときだけで、
新規に開く場合はメンテしなくても良いです。開いた先で親があれば、親
に自分の window オブジェクトを登録する、ってやった方が楽です。

親には子を登録する器だけを用意しておきます。
子には親があれば親の器に自身を設定する記述をしておきます。



> 
> 【作成した処理】
> @については未着手
> 
> Aについて、以下の処理を作成
> →1)子ウィンドウを開く処理部分で、セッションに開いた情報を持たせる
>     --------------------------------------------------------------
>   ある、ボタン押下関数内
>   Session("WinOpen")=True
> 
>   Dim jscript As String
>   jscript &= "<script language=javascript>"
>   jscript &= "window.open('子画面.aspx','Win','height=600,width=400,…省略…');"
>   jscript &= "</script>"
>   Response.Write(jscript)
>   --------------------------------------------------------------

Response.Write() って、<html> の上に描画されちゃいますが良いのですか?
.NET の場合は、RegisterClientScriptBlock ってのと、RegisterStartupScript
ってゆー2つのメソッドを使い分けるそうです。

子窓を開くスクリプトなのに、親画面のページロードでは無さそうな文言ですが・・・

> 
>  2)親ウィンドウの遷移先のPage_Load関数内でSession("WinOpen")がTrueなら
>   子ウィンドウと同じ名前でブランク画面(座標指定で小さい画面)を開き、子ウィンドウを閉じる

子窓は、タイトルバー込みで100*100ドット以下に小さくすることは出来ません。




>  ※上記サイトにも書かれているのですが、親ウィンドウに遷移前に子ウィンドウが閉じられた場合、
>   画面が若干ガチャガチャするのです(読み込み処理のため?)
>   (子ウィンドウが閉じられたという情報を取得したいのですが、方法がわかりません…)

提示したスクリプト例には、子が閉じていなかったら、って判定していますよ。

>   --------------------------------------------------------------
>   親ウィンドウの遷移先のPage_Load関数内
>   If Session("WinOpen")=True Then
>     Dim jscript As String
>     jscript &= "<script language=javascript>"
>     jscript &= "var win = window.open('','Win','height=0,width=0');"
>     jscript &= "win.close();"
>     jscript &= "</script>"
>     Response.Write(jscript)
>     Session("WinOpen")=False
>   End If
>   --------------------------------------------------------------

セッションで窓の開き具合を管理するのは好ましくないかと。
というか、セッション自身が生きている間はこのセッションを作った元ネタである
親窓が開いているわけで。サーバー側で子窓の数まで管理するのはやめた方がよろ
しいと思います。

> 
> Aの処理について最適な方法がありましたら、教えて下さい。
> 長くなってしまったので読むのが億劫かもしれませんが、どうぞよろしくお願い致します。

コメントを入れておいたのでがんばって理解してください。
理解できたら、どのように理解できたのかレスして下さい。
なんか変な書き方ですが、普通に書いたらどーなるのか自分で試してみて下さい。
試した結果を報告して下さい。

引用返信 編集キー/
■20835 / inTopicNo.6)  Re[5]: window.openのdependentスタイルについて
□投稿者/ ま (54回)-(2008/06/17(Tue) 22:55:00)
肝心なこと忘れていました。
IE6で確認しました。
最初に提示したスクリプトは動かないです。
for in を for (;;) に変更してあります。

動作確認は、
(1)親画面表示 −>子窓表示 −>親画面クローズ
   で、子画面が閉じられること。

(2)親画面表示 −>子窓表示 −>親画面リロード
   で、子画面が閉じられること。


です。

要件にあっていなくてもしょげないで下さいね〜。
要件にピッタンコでも、つれないレスはご法度ですよ〜。


引用返信 編集キー/
■20837 / inTopicNo.7)  Re[6]: window.openのdependentスタイルについて
□投稿者/ hana (24回)-(2008/06/18(Wed) 08:24:59)
まさん、ご返信ありがとうございます。

No20805で書いて下さったコードを元に
昨日の午前中に色々調べ、
window.onbeforeunloadの存在を知り
そこから色々試したのですが、
うまくいかなくて萎えておりました。。。

心機一転、本日も頑張りたいと思います。

No20833のコードをまずは実装してみたいと思います。
分からないことがあれば、また質問させて頂くかと思いますが
どうぞよろしくお願い致します。
引用返信 編集キー/
■20850 / inTopicNo.8)  Re[7]: window.openのdependentスタイルについて
□投稿者/ hana (25回)-(2008/06/18(Wed) 12:03:05)
現状報告です。

以下のコードを親画面.aspxに記述。
> <script>
> var oya = {
>   push:function(wKo) {
>   	alert("この子を [" + wKo + "] 登録すんぞ〜");
>      this.arr.push( wKo );
>   },
>   arr:[],
>   closeAll:function() {
>   	alert("[" + this.arr.length + "]close!!");
>      for (var x=0;x < this.arr.length;x++) {
>      	var w = this.arr[x];
>      	alert(" この子は " + w + "  微妙かな?");
>         if (w && w.closed == false) w.close();
>      }
>   },
>   init:function() {
>      var oThis = this;
>      window.onbeforeunload = function() {
>      	alert("閉じられるぞー");
>          oThis.closeAll();
>      }
>   }
> };
> window.onload = function() {
> 	oya.init();
> }
> </script>

以下のコードは親画面.aspx.vbのボタン押下関数内に内容を変更して記述。
> <input type=button onclick="javascript:window.open('ko.html','ko','width=100,height=100')" value="komado">
→ Dim jscript As String
  jscript &= "<script language=javascript>"
  jscript &= "window.open('子画面.aspx','ko','height=600,width=400,…省略…');"
  jscript &= "</script>"
  Response.Write(jscript)
※既に稼動中のシステムの改修のため、この子画面を開くコードは
 既にコーディングされている子画面を開くコードを
 今回用に書き換えて使用しているため、上記の内容になった。

以下のコードは子画面.aspxに記述。
> <script>
> window.opener.oya.push( window );
> </script>


【動作確認】
親画面へ遷移→ボタン押下→子画面表示→親画面から別画面へ遷移
-------------------------------------
ボタン押下以降の動作(表示コメント)
@閉じられるぞー
Aこの子を閉じるぞ[0]
B閉じられるぞー
Cこの子を閉じるぞ[0]
Dこの子を[[object]]登録すんぞ〜
E子画面表示
F親画面遷移ボタン(戻るボタン)押下
G閉じられるぞー
Hこの子を閉じるぞ[1]
Iこの子は[object]微妙かな?
J子画面が消え、親画面が遷移
-------------------------------------

上記@〜Jのようになれば、思い通りの動作なのですが
何回か(ボタン押下を)行っているとDが表示されない場合があります。
Dが表示されない場合は親画面が子画面があるとみなしていないため
親画面が遷移または閉じられても、子画面は閉じてくれません。
----------------------------------------
Dが表示されない場合の動作(表示コメント)
@閉じられるぞー
Aこの子を閉じるぞ[0]
B閉じられるぞー
Cこの子を閉じるぞ[0]
D子画面表示
E親画面遷移ボタン(戻るボタン)押下
F閉じられるぞー
Gこの子を閉じるぞ[0]
H子画面は消えずに、親画面が遷移
----------------------------------------

ボタン押下で子画面を親画面に登録する処理は
枝分かれ処理ではないのに、
なぜDが表示されたりされなかったりするのでしょうか?

> Response.Write() って、<html> の上に描画されちゃいますが良いのですか?
> .NET の場合は、RegisterClientScriptBlock ってのと、RegisterStartupScript
> ってゆー2つのメソッドを使い分けるそうです。
子画面表示のjavascript部分のせいなのかな…
午後から子画面表示のjavascript部分を変えてみて
再度検証してみます。

以上、よろしくお願い致します。

引用返信 編集キー/
■20859 / inTopicNo.9)  Re[8]: window.openのdependentスタイルについて
□投稿者/ hana (26回)-(2008/06/18(Wed) 14:11:18)
現状報告第2弾です。

> ボタン押下で子画面を親画面に登録する処理は
> 枝分かれ処理ではないのに、
> なぜDが表示されたりされなかったりするのでしょうか?
> 
>>Response.Write() って、<html> の上に描画されちゃいますが良いのですか?
>>.NET の場合は、RegisterClientScriptBlock ってのと、RegisterStartupScript
>>ってゆー2つのメソッドを使い分けるそうです。
> 子画面表示のjavascript部分のせいなのかな…
> 午後から子画面表示のjavascript部分を変えてみて
> 再度検証してみます。

子画面表示部分を
>     --------------------------------------------------------------
>   Dim jscript As String
>   jscript &= "<script language=javascript>"
>   jscript &= "window.open('子画面.aspx','Win','height=600,width=400,…省略…');"
>   jscript &= "</script>"
>   Response.Write(jscript)
>   --------------------------------------------------------------
から
--------------------------------------------------------------------------------------
If (Not IsClientScriptBlockRegistered("clientScript")) Then
  Dim jscript As String
  jscript &= "<script language=javascript>"
  jscript &= "window.open('子画面.aspx','ko','height=600,width=400,…省略…');"
  jscript &= "</script>"
  RegisterClientScriptBlock("clientScript", jscript)
End If
--------------------------------------------------------------------------------------
に変更したところ、
「alert("この子を [" + wKo + "] 登録すんぞ〜");」
が表示されないという現象は発生しなくなりました。

【調査結果】
**********************
・ソース変更前
 表示する:35/50回
 表示しない:15/50回
・ソース変更後
 表示する:50/50回
 表示しない:0/50回
**********************

RegisterClientScriptBlockを使用せず
Response.Writeを使用したのが原因だったのでしょうか???

引用返信 編集キー/
■20875 / inTopicNo.10)  Re[9]: window.openのdependentスタイルについて
□投稿者/ ま (55回)-(2008/06/18(Wed) 23:22:53)
No20859 (hana さん) に返信
> 子画面表示部分を
>>  Response.Write(jscript)
> から
>   RegisterClientScriptBlock("clientScript", jscript)

ASP -> ASPX 移行ですか?それならば最初にそう書いておけばもう少し
他の詳しい人からレスがあったかもしれませんね。この質問内容では、
ASPというより、ASPXというより、JavaScript寄りですから。

> RegisterClientScriptBlockを使用せず
> Response.Writeを使用したのが原因だったのでしょうか???
>
えーっと、とりあえず、明日、Response.Write に直してから、実行して、
子画面のソースを見てください。右クリックで、ソース見るか、
アドレスバーを表示させて、その中で、view-source:って打ち込むと
ASPXが出力したHTMLソースを表示できます。
Response.Write したコードがどこに書き込まれているかがポイントです。
たぶん、<html>よりも上です。<!DOCTYPE ... /> よりも上かもしれません。

まずは、動いたから良かった万歳で終わらせず、原因を探った方が身のため
です。

もう一息ですからがんばってください。

Registerなんちゃらメソッドの詳しい使い方は、
RegisterStartupScript サンプル
で検索して、@ITの記事があるのでそこで良く動作を確認して下さい。

# 当方は、Registerなんちゃらはどちらも使ったことがありません。し、
# Response.Write も使ったこと無いです。
# でも、折に触れて検索して覚えておくだけでも、何かの役に立つんですねw


引用返信 編集キー/
■20879 / inTopicNo.11)  Re[10]: window.openのdependentスタイルについて
□投稿者/ hana (27回)-(2008/06/19(Thu) 09:26:09)
2008/06/19(Thu) 09:28:35 編集(投稿者)

> Response.Write したコードがどこに書き込まれているかがポイントです。
> たぶん、<html>よりも上です。<!DOCTYPE ... /> よりも上かもしれません。
<!DOCTYPE ... /> よりも上、HTMLソースファイルの一番最初でした。

> Registerなんちゃらメソッドの詳しい使い方は、
> RegisterStartupScript サンプル
> で検索して、@ITの記事があるのでそこで良く動作を確認して下さい。
教えていただいた記事を読みました。
初心者が読んでも分かりやすい内容でした。

<引用>
Response.Writeメソッドによる出力は、ページの先頭(<html>要素よりもさらに前)に埋め込まれる。
これはHTMLとしては正しくないため、予期せぬ誤動作を招くことがあり
(スマート・ナビゲーションの使用時など)、この方法は極力使用すべきでない。
</引用>

Response.Writeで書いたコードが<!DOCTYPE ... /> よりも上に埋め込まれたことにより
javascript文が枝分かれ処理ではないにも関わらず
通ったり通らなかったりという現象が発生したのですね!!!

昨日は、
Response.Writeだと上手く行かない場合があるが
RegisterClientScriptBlockだとなぜか必ず上手く行く。
なんで?
の状態でしたが、まさんが教えて下さった記事により
なんで?が解決しました。
スッキリしました。

長々とお付き合い頂き、本当にありがとうございました。

またお世話になることがあるかと思いますが、
どうぞよろしくお願い致します。


# 解決済みフラグを付けるのを忘れていました…。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -