• ベストアンサー

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は開いた瞬間にプログラムを実行して閉じるようにしてあります。 よろしくお願いします。

  • CGI
  • 回答数5
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • HTML上(javascript)からCGIを実行する方法

    javascriptから外部実行ファイル(javascriptファイルではなくperlなどのCGI) を実行する方法を探しています。 下記のようにindex.htmとtest.cgiファイルを用意して、index.htm内の javascriptから外部cgiを実行させ、cgiの結果(test.cgiでは単に 『test』と表示するのみ)を表示したいと考えています。 利用増ですが、cgiやssiが使用できないサーバにindex.htmを置いて、 cgiが使用できるサーバ上のcgi結果を取得したいものです。 通常のcgiのように、1ページでcgi結果を表示するものではなく、 HTMLファイルの一部にcgi処理結果を表示させたいものです。 そもそも、SSIを使用しなければ下記のようなHTML内にcgiなどの 実行結果を表示する事は出来ないのでしょうか。 よろしくお願い致します。 ※下例のプログラムではcgi結果は表示されませんでした・・・。 ---<index.htm>---------------------------------------- <HTML> <BODY> <SCRIPT language="Javascript" src="http://xxx.xxx.xxx.xxx/test.cgi"></SCRIPT> </BODY> </HTML> ---<test.cgi>---------------------------------------- #!/usr/bin/perl print "test"

  • 以下のようなものを作ったのですが、cgiによるjavascript出力

    以下のようなものを作ったのですが、cgiによるjavascript出力がうまくいきません。 理由がわからず困っています。 【http://www.gran-fenix.com/nao_archive/test/index.htm】 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>テスト</title> <script type="text/javascript"><!-- var pageseq = 0; //--></script> <script src="./trick/test.cgi"></script> </head> <body style="background-color:white"> <noscript><p style="color:deeppink;font-weight:bold"> 【注意】 JavaScript が無効になっています。 </p></noscript> <br> <h1 style="font-size:200%;font-weight:bold;color:maroon"> <script type="text/javascript">document.write(page_title[pageseq]);</script> </h1> <hr> </body> </html> 【http://www.gran-fenix.com/nao_archive/test/trick/test.cgi】 #!/usr/local/bin/perl $jscr = 'test.txt'; $scr_body = ''; open (JSCR "<$jscr") || die "Can't open the JavaScript file\n"; while (<JSCR>) { $scr_body .= $_; } close (JSCR); print "Content-Type: text/javascript\n\n"; print <<"SCR"; $scr_body SCR 【http://www.gran-fenix.com/nao_archive/test/trick/test.txt】 var page_title = new Array(); page_title[0] = "テスト成功"; 具体的には、test.txtにある「テスト成功」の文字がHTMLのh1タグ部分に出力されません。 HTMLで、scriptタグのsrcを、test.txtと同じ内容のJSファイル test.js(場所も同じディレクトリ)にしてみると成功するので、原因はcgiにあると思うのですが、どこがおかしいのかわかりません。 なお、test.cgiのパーミッションは755、test.txtのパーミッションは644です。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • ネットサーフィンについて

    ネットでクリックして 小窓の写真画像が開いて それをとじる時に通常は バッテン印かclose印をクリックしますが パソコンのキーボードボタンひとつで その小窓をとじるような操作はできないものでしょうか? クリックするのが少し面倒な場合にキーボード操作で やりたいのですが、よろしくお願いします。

  • ブラウザの戻るボタンでの動きをつかまえたい

    はじめまして。 簡単なアクセス分析のようなものを作っています。 ページの中に<script src="Javascript" ....という ようなタグを埋め込んで、外部ファイルになっている Javascriptのプログラムを呼び出し、Javascriptから IMGタグを作りながら、CGIを呼んで、ファイルに 情報を書き込んでいます。 Javascriptなので、Webのページが開かれるたびに カウントできると思っていたのですが、戻るボタン でページが変わったときには、ファイルへの書き込み ができていないようなのです。 Javascriptのテストプログラムでalertを出して みたところ、alertは、戻るボタンでページが開かれ たときにもちゃんと動作しています。 いったい何が原因で、CGIが呼べないんでしょうか・・? どなたかお助けを・・

  • JavaScriptからページを変移せずにcgiへ値を送信

    onmousedownをイベントハンドラとし、マウスクリックされる度にその瞬間のマウスのX座標とY座標を記録するプログラムを作っています。座標獲得まではJavaScriptで出来たのですが、この値をcgiに上手く渡せません。そもそもJavaScriptからcgiプログラムを呼び出すにはどうしたら良いのかもよく分かりません。 とあるところでdocument.write('<script src="abc.cgi"></script>')を使う方法があると聞いたので、アドレスの後にクエリで座標の値を続かせる形で試してみたのですが、document.writeでページの書き換えが行なわれてしまうために1度しか使えず、またそのページの閲覧も中断されてしまうので実用的なものではありませんでした。 このページ変移が行なわれてしまうというのも問題です。 これらの解決方法を教えていただきたいと思います。 皆様、どうかよろそくお願いいたします。

  • CGIメールフォーム送信アラートについて

    よくCGIのメールフォームのサンプルの動作を試したりするのですが中には 送信ボタンをクリックすると「サンプルです。」や「サンプルのため送信できません。」 などのアラート表示されますがJava Script だと思うのですがCGIに同じ仕組みを取り入れるには どうすればいいでしょうか? 詳しい方教えて下さい。 参考になりそうなURLでも よろしくお願いします。

    • ベストアンサー
    • CGI
  • CGIでJavaScript

    今自作の管理ページを作っているのですが、ある部分で詰まってしまってしまいました(^^; プルダウンメニューを付け加えるコードがありますよね? <SELECT NAME=menu> <OPTION VALUE=$i>$name</OPTION> </SELECT> ↑これです プルダウンメニューから項目を選ぶ時、今どの項目が選択されているかをプログラム側で判断することはできないでしょうか? 今のところVALUE値に0~Nの値を設定して、QUERY_STRINGから値を取り出し、そこから判定させているのですが、これだと一々メッセージとして飛ばしてやらないと判定できませんよね?(できれば更新しないで反映させたいのです) そこで、項目を選択した瞬間に今どの項目が選択されているのか(selectedIndexを使うのでしょうか?)をプログラム側に渡したいのです。(項目番号だけでいいので) JavaScriptの中で$aなど変数を設定してもどうもうまく代入してくれませんでした。 その時のコードは、 function change(){ $a = form.select.selectedIndex; } です。 それともう一つ、CGIの場合、リアルタイムに処理をすることはできるのでしょうか? 掲示板など、投稿ボタンを押すとページが更新されて、メッセージが追加されます。 上記のプルダウンメニューを選択した瞬間にいろんな処理(JavaScriptではなくPerlで)をさせることは可能でしょうか? かなりわかりにくい文章になってしまいましたが、 どなたか、わかる方レスお願いしますm(__)m

    • ベストアンサー
    • Perl
  • pythonでのCGI作成

    python で cgiを作成しているのですが、 if f.getfirst('btn1'):  ### 外部スクリプト起動 ###  os.system("python /var/www/cgi-bin/test.py") のように、このボタンが押されたら外部スクリプト起動のようにしたいのですが、どうすればいいでしょうか? たとえば、os.system("mkdir test")のようにすれば、上手くいくのですが、python ~やperl ~のようにすると上手くいきません・・・ (もしかするとapacheの設定か何か必要なのでしょうか?) 初心者丸出しの質問かもしれませんが、よろしくお願いします

    • 締切済み
    • CGI
  • CGI/perlのエラー

    CGIのテストをしています。 サーバーはUbuntu14.04 htmlで <html> <head><title>HTMLサンプル</title></head> <body> ボタンサンプル<br> <form action="cgi-bin/test.cgi" method="post"> <button type="button">ボタン</button><br> <input type="submit" value="送信"> </form> </body> </html> test.cgi #!/usr/bin/perl system = ("date >> webwrite""); 実行すると End of script output befor heads: test.cgi のエラーで止まってしまいます。 ファイル webwriteは作成されています。 何か、終了処理が必要なもでしょうか?

  • javascriptの動的読み込みについて教えてください

    javascriptの動的読み込みについて教えてください いつもお世話になります。 jqueryを勉強中のものです。 少しややこしいのですが、 以下のmenu.htmlとmain.htmlを持ったframe.htmlで、メニューの試験ボタンを押してmain.htmlの<div id="target_id">にload.htmlを動的に読み込んだ時、loadされたhelloボタンが作動しません。 menu.htmlのtest()中のalert(data);でload.htmlの<script>が読み込まれていることは確認できるのですが・・何が原因でどこが悪いのでしょうか? よろしくご指導お願いします。 frame.html ----------------------------------------------------------- <html> <head> <title>Dynamic Load Test</title> </head> <frameset name="frame" cols="180,*"> <frame name="menu" src="menu.html"> <frame name="MainPanel" src="main.html"> </frameset> </html> ----------------------------------------------------------- menu.html ----------------------------------------------------------- <html> <head> <script src="http://code.jquery.com/jquery-latest.js"></script> <script type="text/javascript"><!-- function test(){ jQuery.get("./load.html",function(data){ alert(data); $("#target_id",window.parent.MainPanel.document).html(data); }); } // --></script> </head> <body> <button onClick="test();">試験</button> </body> </html> ----------------------------------------------------------- main.html ----------------------------------------------------------- <html> <head> </head> <body> <h1>main.html</h1> </body> <div id="target_id"></div> </html> ----------------------------------------------------------- load.html ----------------------------------------------------------- <h1>load.html</h1> <script type="text/javascript"><!-- function hello(){ alert("こんにちわ"); } // --></script> <button onClick="hello();">hello</button> -----------------------------------------------------------

専門家に質問してみよう