• 締切済み

画面制御

PHPEXCELを使っての出力をしています。 この際に、DBからの読み込みに時間がかかっており、ユーザーより 出力完了までの間、画面上のボタンをすべて押せないようにしてほしい との要求があったのですが、実現できずに困っています。 良い方法は無いでしょうか? ・show.html …中略… <script type="text/javascript"> function doDownloadExcelFile { document.form1.action = 'downloadExcelFile.php'; document.form1.submit(); } </script> …中略… <input type="button" value="Excel出力" onClick="doDownloadExcelFile()"> …中略… ・downloadExcelFile.php   →画面で設定された条件通りにDBを読み込んで、     EXCELファイルを出力する。 Javascriptでsubmitの前にdisabled=trueとし、後ろでdisabled=falseとすると 一瞬でdisabled=falseが実行されてしまいます。。。 何か良い方法はありますでしょうか。 宜しくお願い致します。

  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

回答No.2

まず、jQueryなどを使って、Ajax通信を行う必要がありそうです。 javascriptで、例えばcreateDownload.phpなんかを実行させて、Ajax処理でレスポンスが返ってくるまでブラウザのボタンを押せないようにして、createDownload.php内では、ユニークな名前のexcelファイルのキャッシュを作成し、作成が完了したら何らかのレスポンスを返す。 そして、最終的にその作成したキャッシュファイルをダウンロードする様なリダイレクト処理が必要ですね。 サンプル作ってみました。 ------index.php(ファイルをダウンロードするフォームの置いてある画面) <html> <head> <title>test</title> <script type="text/javascript" src="/js/jquery-1.5.1.js"></script> <script> $(document).ready(function(){ $('#download').submit(function(){ var inputs = $(this).find('input'); inputs.attr('disabled', 'disabled'); $.ajax({ type : "POST", url : "http://example.com/createExcel.php", cache: false, data : "hoge=flag", success : function(msg){ alert('success'); inputs.removeAttr('disabled'); window.location = "http://example.com/download.php?file=" + msg; }, error : function(req, status, err){ alert('failure'); } }); return false; }); }); </script> </head> <body> <form action="" method="POST" id="download"> <input type="submit" value="download" /> </form> </body> </html> ------createExcel.php(Excelファイルのキャッシュを作成する) <?php $file_name = uniqid() . ".txt"; //予めtmpというディレクトリは作成しておく。 file_put_contents("tmp/{$file_name}", "test"); sleep(5); echo $file_name; ?> ------download.php(キャッシュで作ったExcelファイルをダウンロードする) <?php if(!isset($_GET['file'])) exit(); $file_path = $_GET['file']; if(!preg_match("/^[a-z0-9]+$/i", $file_path)) exit(); $file_path = "tmp/{$file_path}"; if(file_exists($file_path)) exit(); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="result.xls"'); echo file_get_contents($file_path); ?> とりあえずこんな感じで意図した挙動はしていたようです。 このプログラムの問題点は、キャッシュファイルをどんどん作成するので、ゴミがどんどんたまります。 適当に日数がたったキャッシュを削除するようなプログラムを作って、cronなどで定期的に実行し、古いファイルを削除するようにしないといけません。

  • noris02
  • ベストアンサー率74% (56/75)
回答No.1

DBからの読み込みが完了したら showに(再度?)画面転移するという方法しか おもいつかないです。

関連するQ&A

  • POST送信かGET送信か

       ------------------------------------------ <SCRIPT language="JavaScript"><!-- function GoPage(url, id){ document.form.action = url; document.form.id.value = id; document.form.submit(true) } // --></script> <!--中略--> <input type="submit" name="submit" value="送信" onClick="javascript:GoPage("a.php", "1")">    ------------------------------------------    上記のような処理を書いた場合、 遷移先である a.php で id(値:1)を取得する時は POSTで受け取るのですか?それともGETでしょうか?   

  • disabledの点で。

    このソースを開いて、更新ボタンをクリックすると、 2の方のテキストボックスが半透明になりますが、それは半透明にしないようにすることは可能なのでしょうか。 お願いします。 <html> <head> <title></title> <script language="JavaScript"> <!-- function setTF(){ if(document.form1.text1.value=="") document.form1.text2.disabled = true; else document.form1.text2.disabled = false; } //--> </script> </head> <body> <form name="form1"> 1<INPUT type="text" name="text1" onChange="setTF()"> 2<INPUT type="text" name="text2" disabled> <INPUT type="submit" value="登録" onClick="return setTF()" name="submit"> </form> </body> </html>

  • disabledの点で。2

    また同じソースでの質問なのですが、以下のようなソースで、1のテキストボックスに過去に入力したもの(プルダウンみたいに下がって出てくる履歴のようなもの)を選択すると、2の方の入力ができなくなります。履歴の数字を入れても2の方に記入できるようにするにはどのようにしたら良いのでしょうか。また、これらの処理を行うとき、onChange以外のものを使ってできるのでしょうか?大変困っております、よろしくお願いします。 <html> <head> <title></title> <script language="JavaScript"> <!-- function setTF(){ if(document.form1.text1.value=="") document.form1.text2.disabled = true; else document.form1.text2.disabled = false; } //--> </script> </head> <body> <form name="form1"> 1<INPUT type="text" name="text1" onChange="setTF()"> 2<INPUT type="text" name="text2" disabled> <INPUT type="submit" value="登録" onClick="return setTF()" name="submit"> </form> </body> </html>

  • 複数ボタンを制御出来る2度押し防止ボタン

    HTML5+CSS3でゲームを作っています。 フォームがあり、ボタンが複数並んでいます。 <SCRIPT TYPE="text/javascript"> <!-- function sendform(){ submitForm(); } function submitForm(){ document.form1.submit(); } // --> </SCRIPT> <FORM action="buy.cgi" method="post" name="form1" id="form1"> <button class="button8" type="submit" name="d4_buy" value="300 onclick="sendform()">300購入</button> <button class="button8" type="submit" name="d4_buy" value="400" onClick="sendform()">400購入</button> </FORM> 上記で正常に作動しますが、3G環境など通信状態の悪い時に、「300購入ボタンを押した直後に400購入ボタンを押す」と700購入が出来てしまいます。 【希望事項】 2つのボタンを連続して押しても2つ目が無効になるようにしたいというのが希望です。 ネットで調べたところ ****************************************** http://okwave.jp/qa/q627484.html ****************************************** <HTML><BODY> <FORM method="get" action="http://www.google.com/search"> <INPUT type="submit" value="submit1" onclick="this.form.q.value=this.value;this.disabled=true;this.form.submit()"> <INPUT type="submit" value="submit2" onclick="this.form.q.value=this.value;this.disabled=true;this.form.submit()"> <INPUT type="hidden" name="q" value="" > </FORM></BODY></HTML> ****************************************** という例があったため、この例に従って <SCRIPT TYPE="text/javascript"> <!-- function sendform(){ submitForm(); } function submitForm(){ document.form1.submit(); } // --> </SCRIPT> <FORM action="buy.cgi" method="post" name="form1" id="form1"> <button class="button8" type="submit" value="300 onclick="this.form.q.value=this.value;this.disabled=true;this.form.sendform()">300購入</button> <button class="button8" type="submit" value="400" onclick="this.form.q.value=this.value;this.disabled=true;this.form.sendform()">400購入</button> <INPUT type="hidden" name="d4_buy" value="" > </FORM> としてみたのですが、うまく数値の引き渡しが出来ません。(NULL となります) どのように改造すればいいか教えてください。 よろしくお願いいたします。

  • テキストボックスを無効にすると値が取得できない

    javascriptでこのようにテキストボックスを無効に してフォームを送信するとphp側でvalueの値が取得できないのですが、入力無効にすると valueは送られないんでしょうか? <form> <input type="text" id="sample" name="sample" value="値" /> </form> スクリプト .document.getElementById('sample').disabled = true; valueにはphpで値をセットし、それをテキストボックスで編集できないようにして 値を飛ばそうとしたのですがテキストボックスのvalueの値が来てないようです。 自分なりに考えたんですが、送信する瞬間だけ(submitボタンが押された時) テキストボックスを有効に戻すようにコードを書いているのですが これ以外で何かありますか? ---このように対処--- <form onsubmit="return disb()"> <input type="text" name="sample" value="値" /> </form> スクリプト document.getElementById('sample').disabled = true; function disb(f){ f.sample.disabled = false; }

  • 結果がfalseでもsubmitしている?

    チェックボックスにチェックが入ったら テキストエリアに入力ができて、その入力チェックをする というスクリプトを書いていたのですが、 一番目のチェックボックスにチェックが入ったら 入力可能というところは出来るのですが 入力チェックで結果がfalseになっているのに submitされてしまいます。 どこか間違っているのでしょうか。 <html> <SCRIPT language="javascript"> <!-- function Yuukou(){ if(document.DOWN.A_CK.checked == true) { document.DOWN.A_SEL.disabled = false; } else{ document.DOWN.A_SEL.disabled = true; } } function check(){ if(document.DOWN.A_CK.checked == true) { if(document.DOWN.A_SEL.value =="") { alert("シリアル番号を入力してください") return false; } (略) } } //--> </SCRIPT> <FORM name="DOWN" action="A.cgi" onSubmit="check()" method="POST"> <INPUT type="checkbox" name="A_CK" id="A_CK" onClick="Yuukou()"> <INPUT size="20" type="text" disabled="disabled" name="A_SEL"> <input type="submit"> </form> </html>

  • JavaScript+PHPでのボタンの値について

    お世話になります。現在下記のようなコードです。 #Html側 <script language="JavaScript"><!-- function send1() { document.Form1.submit(); } function send2() { document.Form2.submit(); } // --></script> <form name="Form1" action="tesuto1.php" > 中略 </form> <form name="Form2" action="tesuto2.php" > 中略 </form> <form> <input type="button" name="botan" value="送信" onClick="send1()"> </form> <form> <input type="button" name="botan" value="取消" onClick="send2()"> </form> <form> <input type="button" name="botan" value="確認" onClick="send1()"> </form> #PHP側 tesuto1.php echo "値は".@$_POST["botan"]."です"; という感じで、どのボタンがクリックされたか判別するために、 ボタンの値を取得したいのですが。 よろしくお願いします。

  • 選択肢によってラジオボタンを押せなくする(無効にする)

    2.7.2.の質問があって、ラジオボタンの選択肢(1~5まで)によって、 1を選択したら、2.7.2.1のみ選択、その他はラジオボタン押せなくする 、2を選択すると、2.7.2.2のみ選択、その他はラジオボタン押せなくする 、3を選択すると、2.7.2.3のみ選択、その他はラジオボタン押せなくする 4、5を選択すると、2.7.2.1、2.7.2.2、2.7.2.3、すべてを押せなくして、submitボタンを押して次へという処理をしたいのですが、下記のプログラムではまったく動作しません。 どこが悪いのでしょうか?お分かりの方教えていただけませんか? <script language="javascript"> <!-- function check(){ if(document.form1.BQ20[0].checked == true) { document.form1.BQ201.disabled = false; document.form1.BQ201.bgColor='#FFFFFF'; }else if(document.form1.BQ20[1].checked == true) { document.form1.BQ202.disabled = false; document.form1.BQ202.bgColor='#D4D0C8'; }else if(document.form1.BQ20[2].checked == true) { document.form1.BQ203.disabled = false; document.form1.BQ203.bgColor='#D4D0C8'; }else{ document.form1.BQ201.disabled = true; document.form1.BQ201.bgColor='#FFFFFF'; document.form1.BQ202.disabled = true; document.form1.BQ202.bgColor='#FFFFFF'; document.form1.BQ203.disabled = true; document.form1.BQ203.bgColor='#FFFFFF'; } } // --> </script> 以下省略

  • JAVASCRIPTでINPUT

    HTMLとJAVASCRIPTとJSPを使ってシステム構築をしております。 --------------- <html> <head> <SCRIPT Language="JavaScript"> <!-- function send() { alert("<input type=text name=name2>"); } // --> </SCRIPT> </head> <body> <form onSubmit="send(); return false;"> <input type=text name=name1> <input type=submit> </form> </body> </html> --------------- 上記のコードでやりたいことは、 submitボタンが押されたときにJAVASCRIPTを呼び出し JAVASCRIPT上で文字を入力し次画面へ送信するような機能を作りたいと思っているのですが、本を見てもなかなか載っていません。 もしかしたらJAVASCRIPTだけではできないかもしれません。 JSPまたはPHPで出来る機能でも良いので教えてください。

  • 次画面への受け渡し

    お世話になります。 1の画面から、2の画面へ遷移します。 1の画面でのボタン押下により、hiddenの内容を2の画面に渡し、2の画面のボタン押下で受け渡しているか確認したいのですが、やり方がわかりません。 下に試したものをのせておきます。 あと、書き方で問題があったり、こうした方がいいという注意もしてくださると助かります。 単純なJavaScriptだと思うのですが、初心者でどうしたらいいかもわかりません。助けてください。 1の画面: <HTML> <HEAD> <script language="JavaScript"> <!-- function selEvent(selID){ document.frmAct.fuseaction.value = selID; alert(selID); } --> </script> </HEAD> <BODY> <form name="frmAct" method="post" action="form_action2.html"> <INPUT TYPE="submit" VALUE="新規登録" onClick="selEvent(1);"> <INPUT TYPE="submit" VALUE="ID検索" onClick="selEvent(2);"> <INPUT TYPE="hidden" NAME="fuseaction" VALUE=""> </form> </BODY> </HTML> 2の画面: <HTML> <HEAD> <script language="JavaScript"> <!-- function kakunin(){ alert(document.frmAct.fuseaction.value); } --> </script> </HEAD> <BODY> <form name="frmkaku" method="post" action="xxx.html"> <INPUT TYPE="button" VALUE="確認" onClick="kakunin();"> </form> </BODY> </HTML>