- PR -

jsfでの子画面の表示と画面を閉じる制御について

投稿者投稿内容
かに
会議室デビュー日: 2005/12/04
投稿数: 11
投稿日時: 2008-06-01 22:23
ぴあちゃんさん

わざわざありがとうございますm(__)m
お手数お掛けして恐縮です…。。
自分の方でも試してみましたが大丈夫そうですね。

>あとはフォームかな。
えと、何かフォームの処理に問題あるんでしょうか?
自分的にはもうこれで解決!って思っていました^^;
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-06-02 00:40
フォームも試した上で何の問題も無ければそれで良しです。

実際に現場投入する前に100画面とか開いて閉じてって
ってやってみた方がいいですね。仕様上の限界まで開いて
ってのが望ましいでしょうけどまぁ、仕様限界の8割も
開けば問題無いかと。

トップの親に登録された既に消えている画面のオブジェクトが
登録されたまんまだと、既存画面に影響が出てくる可能性もあ
りますから。

ま、作りだけですから。
直前の親だけに登録するのか、一番上の親まで参照を引き継ぐ
ようにするのかで、途中でCloseした場合そのインスタンス
を持ってる直系の親の配列からそのオブジェクトだけを抜き出す
ような仕掛けを持っておかないとまずくなる可能性もあります。

コード:
例)
OYA
  KO1
   KO1-1 ... KO1-100
  KO2
   KO2-1 ... KO2-100
  ...



とかなっている時、KO2-50 だけ削除されたら、直系の親だけに登録する
のであれば、KO2 で管理してるインスタンスだけ削除すればよいでしょう。
でも、OYA までインスタンスを引き継いでいる場合は、OYAからも削除して
おかないと画面から消えているけどインスタンスは残ったまんま、という
状態になるので消えた画面のインスタンスは確実に参照を無くすようにし
た方が安全かもしれません。

WindowsXP でも、50 画面くらい一気に開くと極端に動作・操作が重くな
るので開いて閉じて開いて閉じて・・・を繰り返してどこらへんが限界な
のか、限界は特に見られないのかを簡単なスクリプトで試してみるといい
かもしれませんね。GETでlocation.hash で画面ID取ってHTML動的に生成
して新しい画面開くアンカーを表示して・・・・を延々100画面くらい
繰り返すやつを作ってみるといいかも、ですね。

ブラクラなんていう嫌がらせスクリプトがありましたけど、あれ一回引っ掛かった
ことがあるんですけどw。延々スクリプトでwindow.open されてOS止まっちゃった
記憶があります。


かに
会議室デビュー日: 2005/12/04
投稿数: 11
投稿日時: 2008-06-02 17:37
ぴあちゃんさん

なるほど、勉強になります。
テストのときは指摘のとおり実施してみようかと思います。

ただ、1点問題が…
ぴあちゃんさんの教えてくださった実装ですと、どうやら
以下のような場合に子A1、子A2のwindowが閉じられません。。。
親A
子A1(親Aから開かれる)
子A2(子A1からモーダルで開かれる)

親Aがwindow.openで子A1を開いて参照を受け取った場合は、
子A1の画面が閉じられるとモーダルの子A2も一緒に閉じられる
のですが・・・。
子A2の参照も必要なのでしょうか??
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-06-02 18:26
showModalDialog ですよね?

聞いていません。

知りません。

dialogArguments が "undefined" じゃなければ、showModalDialog で開いた
オブジェクトなんでこれで判定して処理を分けて下さい。dialog 優先で閉じる
ようにします。

コード:
<script>
var elm = [];
function addElm(w) {
	alert("addElm:" + w);
	elm.push(w);
}

function closeAll() {
	alert("要素:" + elm.length);
	
	var wins = [];
	var dlgs = [];
	for (var x=0;x < elm.length;x++) {
		var w = elm[x];
		
		alert("この窓の dialogArguments が定義されていれば ダイアログです:" + (typeof w.dialogArguments));
		if (typeof w.dialogArguments != "undefined") {
			dlgs.push(w);
		}
		else {
			wins.push(w);
		}
	}
	close1(dlgs);
	close1(wins);
	elm = new Array();
}
function close1(arr) {
	for (var x=0;x < arr.length;x++) {
		var w = arr[x];
		alert(w);
		if (!w.closed) {
			w.close();
		}
	}
}
</script>



かに
会議室デビュー日: 2005/12/04
投稿数: 11
投稿日時: 2008-06-02 23:32

質問ばかりで申し訳ありません。
とても助かりました!ありがとうございます!

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