プロが教えるわが家の防犯対策術!

1つのボタンで2つのCGIを起動する
htmlのページでjavascriptを用いて1つのボタンで2つのCGIを同時に起動できないか試行錯誤していたのですが、なかなかうまくいきません。
具体的にCGIの1つは、textareaの内容をフォームで送るもので、もう1つは、ボタンが押される度にカウントアップしていき、10回毎にメールが届くというものです。
ですので、実際画面として表示されるのはtextareaの送信結果のみで十分です。
どなたか2つのCGIを同時に起動する方法をご存じの方は御教授願います。

A 回答 (4件)

> No.1 お礼


> 最低限、1つのフレームからボタンを押すと、フレームを2つに分割し、それぞれの結果を表示する程度にはしたいと思っています。

textareaの送信結果画面に<iframe>を作って、そのsrcをカウンターCGIにするのはどうでしょうか。

<frameset>でもできますが、<frameset>の出力から送信結果を表示する<frame>への遷移がちょっと手間(セッション管理が必要)になりそうです。
    • good
    • 0
この回答へのお礼

<iframe>はいいかもしれませんね!
画面として出力することによってメールが送信されない問題も解決できるような気がします。
少し調整して試してみます。

お礼日時:2010/08/23 08:33

No.1です。

ちょっとシンプルにして試してOKでした。

<form action="ページ遷移するCGI" method="post">
<input type="textarea" id="data" name="data">
<button type="button" onclick="multisend(this.form)">2つ送信</button>
</form>

<script type="text/javascript">
function multisend(frm){
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.open("POST", "カウントアップのCGI" , true);
  xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  xmlhttp.send(encodeURIComponent("data="+frm.data.value));
  xmlhttp.onreadystatechange = handler;
  function handler(){
   if (xmlhttp.readyState == 4) {
    if (xmlhttp.status == 200) {
    frm.submit();
    }
   }
  }
}
</script>
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
実際に試すところまでやって頂いてありがとうございます。
このプログラムだとフォームと同時にカウントも動いていました!
…ただ1つ問題がありまして、10になるとカウントはちゃんとリセットされているのに、
メール送信が行われなくなってしまいました;

お礼日時:2010/08/23 08:22

カウントアップしていく方のCGIリクエストは、ページ遷移する


必用がなさそうなので、フォームサブミットじゃなく、AJAXの
非同期通信(XMLHttpRequest)でPOSTするってのはどうでしょう。

フォームのaction属性は、非同期通信の関数にしておいて、
コールバック関数内のjavascriptでそのフォームの送信先を
変えてサブミットするとか

<form action="xhr(this)" method="post" id="frm">
<input type="textarea" id="data">
<input type="submit" value="2つ送信">
</form>

<script type="text/javascript">
 function xhr(frm){
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.open("POST", "/カウント.cgi" , true);
  xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  xmlhttp.send(encodeURIComponent("data="+frm.data.value));
  xmlhttp.onreadystatechange = handler;
  function handler(){
    if (xmlhttp.readyState == 4) {
     if (xmlhttp.status == 200) {
      frm.action="/登録.cgi";
//frmで参照できなかったら、document.getElementById("frm")でも使おう
      frm.submit();
     }
    }
  }
 }

<script>

だめかな、試してません
    • good
    • 0

一般的には、CGI Aを起動し、



  CGI Aの中から、CGI B 、CGI C 、 ・・・ を起動するようにします。

 
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
しかし、その方法では既に実装済みです。
また、最初からフレームを2つ用意する方法、別枠で表示する方法も同様です。
最低限、1つのフレームからボタンを押すと、フレームを2つに分割し、それぞれの結果を表示する程度にはしたいと思っています。

お礼日時:2010/08/20 13:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!