• ベストアンサー

Javascript から CGI の呼び出し

HTMLから、小窓を開いて画像を表示させるプログラムを書いています。 小窓には、画像保存ボタンとCLOSEボタンがあります。 CLOSEボタンを押すと、画像の情報がディレクトリから消されるような仕組み(CGI)になっています。 ただ、困ったことに、ブラウザの右上のバツ印で小窓を消されるとそのCGIが起動しません。 バツ印をつかえなくするか、何か画面を閉じた瞬間にCGIを動かせるような方法はないでしょうか。 ちなみに,現段階のプログラムはこのようなかんじです。 <script language="JavaScript"> <!-- function exit(){ window.open("http://etwas/cgi/test.cgi"); alert("test"); } <!----> </script> </head> <body onUnload="exit()"> こうすることで,閉じた瞬間に新しい画面が開いてくれるのではないか、と思ったのですが うまく行きませんでした。アラートはでるのですが。 ちなみに遷移先のCGIは開いた瞬間にプログラムを実行して閉じるようにしてあります。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.4

小窓を開くことは必須条件なのでしょうか? CGIだけ実行して結果を棄て、まどをそのまま閉じるのならAjaxを使えば良いと思います。 プログラム例: <script language="javascript"> <!-- // ------------------------------------- // ------------------------------------- function exit(){ var xObj = createHTTPRequest(); var fName = "http://etwas/cgi/test.cgi"; var sVoid = ''; xObj.onreadystatechange = function(){ if (xObj.readyState == 4) { if (xObj.status == 200) { sVoid = xObj.responseText; } else { sVoid = "通信に失敗"; } } else { sVoid = "通信中"; } } xObj.open("GET", fName, true); xObj.send(null); } // ------------------------------------- function createHTTPRequest(){ if(window.ActiveXObject && !window.XMLHttpRequest){ try{ return (new ActiveXObject('Msxml2.XMLHTTP')); }catch (e) {} try{ retrurn (new ActiveXObject('Microsoft.XMLHTTP')); }catch (e) {} return (null); }else if(window.XMLHttpRequest){ return (new XMLHttpRequest); }else{ return null; } } //--> </script> CGIの方もJavaScriptでCloseとかしなくても、小窓自体開かずにCGIが実行されますので普通に書き直せると思いますがどうでしょうか? もしも、小窓を開くことが必須ならお邪魔いたしました。

kenpanch7
質問者

補足

ありがとうございます. AJAXというものは、使ったことなかったのですが。コピーしてつかってみるとうまく行きました。 だた、ひとつ質問がありまして。 画面を2,3複数表示させて画面をとじていくときに少しおかしなことがおこります。 というのは、最後に表示した画面しかディレクトリから消されないのです。 CGIをよぶ時に var fName ="http://etwas/cgi/test.cgi?ck=<TMPL_VAR NAME=CK>";とし、値もわたしています。 そして、そのCGIで、 system "cd /DS/tmp;rm /DS/tmp/\"$ENV{'REMOTE_HOST'}\".gnuplot.*"; として、ディレクトリのデータを消しています。 これは基本的にうまく動作しています。 もしかすると、最後のページ意外はEXIT関数にうまく飛んでないのではとおもい、 xObj.send(null); alert("a"); } EXITの最後に、alert("a");をいれるときちんとALERTは表示され、しか も、ディレクトリのデータも消されていました。 ALERTがあればうまくいくのですが,すこし邪魔です。なにか思いつく点はありませんでしょうか。 よろしくおねがいします 。

その他の回答 (4)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.5

> 画面を2,3複数表示させて画面をとじていくときに少しおかしなことがおこります。 > というのは、最後に表示した画面しかディレクトリから消されないのです。 JavaScriptの場合、処理が終了しきらないうちに、別の窓に制御を移した場合はどういうわけか処理そのものがなくなったりします。 Ajax(非同期通信)をSjax(同期通信)に変えても、タイマーでタイミングをとっても、故意にフォーカスを別の窓に移されるとおしまいです。 例えアラートを出しても、タイミングが合わなければ無理のようです。 検索をしてみると国内外問わず同じ悩みがある方がいらっしゃるようで、onBeforeUnloadなども試してみましたがダメでした。 もしかしたらどなたか達人が解決策を回答してくれるかもしれませんのでJavaScriptのカテで問い合わせてみてはいかがでしょうか。

kenpanch7
質問者

お礼

そうしてみたいと思います。丁寧な回答ありがとうございました。

  • takapiii
  • ベストアンサー率55% (944/1707)
回答No.3

>my $ckn = $q-param('ck'); >が抜けてますが、大丈夫ですよね? my $ckn = $q->param('ck'); $ENV{'REMOTE_HOST'}は取得できない場合が多いですが、大丈夫でしょうか。 systemで叩いているコマンドを一度表示して見てはいかがでしょうか。

kenpanch7
質問者

補足

ご指摘ありがとうございます。 実は、横にLINUXパソコンをおいて,見ながらタイプしてたので、うちま違えです。 そして、環境変数は大丈夫なようです。 普通に使うと使用できたので。 もう、あきらめてクローズボタンで閉じるように使う人にいうのが楽かもしれません。

  • takapiii
  • ベストアンサー率55% (944/1707)
回答No.2

それって、単にブラウザのポップアップブロックが有効になっている訳じゃないでしょうかね…。 試すと普通に動きますが、端末依存でもないですか? 後、<!---->じゃなくて//-->であるとか、httpの前のブランクを削除するとか、バグになるところは念のため排除しておいた方がいいですよ。今回は関係なさそうですが。

kenpanch7
質問者

補足

ご指摘ありがとうございます。 さっそく修正しました。ちなみに、今まではFIREFOXでみてたのですがIEだと、 小窓が開きました。ただ思ったような動作はしてくれませんでしたが。 CGIが動かないのです。 呼び出し先のCGIはこのような感じです。 use HTML::Template; use strict; use CGI; my $q = new CGI; my $ckn = $q-param('ck'); system "cd /DS/tmp;rm /DS/tmp/\"$ENV{'REMOTE_HOST'}$ckn\".gnuplot.*"; my $template = HTML::Template->new(filename => 'loeschen.tmpl'); print "Content-Type: text/html\n\n", $template->output; そして、tmplはこうです。 <html> <head> <META http-equiv="Content-Type" content="text/html;"> <SCRIPT language="javaScript"> <!-- window.self.close() //--> </script> </head> <body> </body> </html> そして、CLOSEボタンをおすと 、onUnloadにもひっかかって、二回もCGIを呼び出してるみたいです.

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.1

ウィンドウが閉じられるイベントは onunload で拾えませんかね? うまくいったなら、「CLOSEボタン」は本当にただ閉じるだけで良いかと。

kenpanch7
質問者

補足

ありがとうございます。 そうですね。たしかにそのとおりです。ブラウザで動作が異なるみたいです。そして,結局CGIがうごいてないんです。本来したいことは、SYSTEM "rm "を実行したいだけなんですけどね。

関連するQ&A