完全に再現したわけではないのですが、下記のようなプログラムがありました。
<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 コメント:
コメントを投稿