2008/08/06

[JavaScript]window.close()に関する挙動!!

完全に再現したわけではないのですが、下記のようなプログラムがありました。

<cfprocessingdirective pageEncoding="utf-8" />
<html>
<head>
<script type="text/javascript">
function lf_Run(){
var flg = 0;
<cfif IsDefined("Form.flg1")>
flg = 1;
</cfif>
if(flg == 0){
alert(flg + "です。");
}else if(flg == 1){
window.close();
}
alert("hoge");
document.Frm.submit();
}
</script>
</head>
<body>
<form name="Frm" action="" method="post">
<input type="button" value="Run" onclick="lf_Run()">
<input type="hidden" name="flg1" value="1">
<cfif IsDefined("Form.flg1")>
<input type="hidden" name="flg2" value="2">
</cfif>
</form>
<cfoutput>
<cfif IsDefined("Form.flg1")>#Form.flg1#</cfif>
<br>
<cfif IsDefined("Form.flg2")>#Form.flg2#</cfif>
</cfoutput>
</body>
</html>

おそらくこのプログラムを作った作者が考えた処理フローはこのような感じだと思います。

1回目のボタン押下時
a:アラートで「0です」が表示
b:アラートで「hoge」が表示
c:画面に1が表示される

2回目のボタン押下時
画面を閉じる
処理終了

ですが、いざ、実行してみると以下の処理となります(検証済み)

1回目のボタン押下時
a:アラートで「0です」が表示
b:画面に1が表示される

2回目のボタン押下時
a:「ウィンドウを閉じますか?」というメッセージが表示される
b:「はい」を選択した後、アラートで「hoge」が表示
c:画面に2が表示される

処理終了

と実際には、画面が閉じないんですね。

一見、window.close()で処理が終了しそうなのですが、returnをしているわけではないので、処理は進んでいきます。

したがって、上のプログラムは、このように書き換えるのがいいかなと思います。

function lf_Run(){
var flg = 0;
<cfif IsDefined("Form.flg1")>
flg = 1;
</cfif>
if(flg == 0){
alert(flg + "です。");
}else if(flg == 1){
window.close();
//returnを追加
return;
}
alert("hoge");
document.Frm.submit();
}

これだと確かに、2が表示されずに、画面が閉じます(検証済み)
処理を終了したい場合は、明示的にreturnを入れることを心がけたいです。

0 コメント:

コメントを投稿