• 締切済み

PHP画面遷移でスクロール位置を保持する

いつもお世話になっております。 現在、PHP+MySQLでWebアンケートを制作中です。 画面遷移で、アンカーではなくスクロール位置を保持し、 正確に前ページのsubmitボタンを押した時点での表示状態に 戻したいです。 <詳細> q.phpはアンケートフォームです。 send.phpはエラーチェックとDB登録のモジュールです。 comp.phpは(正常に)完了したことを知らせるメッセージページです。 q.phpは、設問数が多いため、アンケートの途中途中に「保存ボタン」を用意しています。 どのタイミングで、どの保存ボタンを押すかは、 途中まで回答していたり、所々回答していたり、全く回答していなかったりと、 いろんなパターンがあると思います。 保存ボタンを押すと、send.phpに移動します。 そこでは、未回答やおかしな点がないかチェックしながら、 その都度、その時点での回答内容がDBに保存されます。 問題(未回答やエラーが)なければ、 comp.phpに移動し、終了のメッセージを表示しますが、 問題がある場合は、q.phpに戻り、問題のある箇所を赤でハイライト等で表示し直します。 このときに、最初にq.phpのsubmitを押した時点と同じ表示状態に戻したいのです。 q.phpにある複数のsubmit(class名、action先はすべて同じ)ボタンを押したときの スクロール情報を変数に格納し、移動先のsend.phpで保持し、(問題あり時に)q.phpに その値を返し、表示位置を同じにするという仕組みを知りたいです。 本番まで日数がないため、最も簡単に実装できる方法をご教授下さい。 なお、ttp://xirasaya.com/?m=detail&hid=175 を読みましたが、 html(PHP?)ソースコードへの実装方法、 javascriptとphpのデータの受け渡し方法等が 不明で実現できませんでした。 また、アンケートを実施(回答)する対象者のブラウザは、ほとんどが、IE6かIE7です。

  • PHP
  • 回答数4
  • ありがとう数3

みんなの回答

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.4

JavaScript はそんなに得意ではありませんので、もっと他に良い書き方があるかもしれません。 ネットから拾ったものをツギハギしただけのものです。 ブラウザによっては動かない場合があります。 眠くなってきた為、いろいろテキトーですが、ご了承ください。。。zzZZZ q.php ----- <html> <head> <script type="text/javascript"> <!-- function test() { var obj = new Object(); obj.y = document.documentElement.scrollTop || document.body.scrollTop; var o = document.createElement('input'); o.name = 'scroolY'; o.value = obj.y; document.Form01.appendChild(o); } // --> </script> </head> <?php $scroolY = $_GET['scroolY']; print "<body onLoad='window.scroll(0, {$scroolY});'>\n"; print "<form action=send.php method=post name=Form01>\n"; for($i=1;$i<10;$i++) { print "<hr>"; print "質問 $i\n"; print str_repeat("<br>" , pow($i , 2)); print "<input type=submit name=Submit[$i] value='保存ボタン' onClick='test();'>\n"; } ?> </form> <body> </html> ----- send.php ----- <html> <body> <?php $scroolY = $_POST['scroolY']; print "<a href=q.php?scroolY={$scroolY}>[ 戻る ]</a>\n"; ?> <body> </html> -----

nccno21
質問者

お礼

回答ありがとうございます。 試してみましたが、動きませんでした。 昨日からWebサイトの情報を見尽くしましたが(たぶん)、この挙動実現するための情報(javascript)は、該当部分のソースコードは載っていましたが、肝心の要の諸設定情報まではありませんでした。 ですので、自分で試行錯誤しながら「補足」のとこまでたどりつきました。

nccno21
質問者

補足

現在、jqueryを導入し各ファイル間で値の受け渡しまで成功しています。 (q.phpでscrollTop取得し、input hiddenでsend.phpにPOST送信。 input hiddenでは、POST受信したy座標値をSESSIONへ保存。 アンケートの回答内容にエラーがあれば、q.phpに戻り、SESSIONにある y座標の値で・・・・・・・onloadするだけのはずが)  onloadだけができません(動きません) 試しにphpのprintでSESSIONの値を書かせると、 きちんとsubmitボタンを押した時点のy座標が表示される。 該当するjavascriptはbody内に <?php if(isset($_SESSION['scrollY'])){   print $_SESSION['scrollY'];?>   <script type="text/javascript">     document.onload = function(){      document.body.scrollTop = "<?php echo $scrollY; ?>";     }   </script> <?php } ?> として記入。 ご指摘をお願いします。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

もう ほんと 何度もすみません。 send.php の ↓の部分 Aタグ閉じ忘れました。 print "<a href=q.php#{$back}>[ 戻る ]</a>\n"; ちなみに、正確には 戻りません。 指定した<a name> のところに移動するだけです。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.2

もう ちゃんと見直してから送信しろって話ですが、さっきのスクリプト一部間違えました。ごめんなさい。 ↓誤りです。自分に戻しちゃってますが、q.php にしといてください。 print "<form action='send.php#{$back}' method=post>\n";

nccno21
質問者

お礼

訂正ありがとうございます。

nccno21
質問者

補足

OKWAVEの機能に、自己レスがないので、こちらに失礼します。 No.4の回答の補足に記載の問題は、なんとか自力で解決しました。 ご回答頂いた内容で、質問に対する直接的な解決にはたどりつけなかったので、 ベストアンサーは”無し”で質問を締め切ります。 お答え頂き、ありがとうございました。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

とりあえず、ざっくりと ゴリゴリと書いてみました。 IE6で動くかどうかは分りません。検証できるものがないもので。 ちなみに、JavaScriptは必要性を感じなかったので、使用していません。 HTMLタグの<a name> で飛ばし先を決めてるだけです。 q.php ----- <html> <body> <?php print "<form action=send.php method=post>\n"; for($i=1;$i<10;$i++) { print "<hr>"; print "<a name=Quest{$i}>質問 $i\n"; print str_repeat("<br>" , 10); print "<input type=submit name=Submit[$i] value='保存ボタン'>\n"; } print "</form>\n"; ?> <body> </html> ----- send.php ----- <html> <body> <?php $DimSubmit = $_POST['Submit']; $DimSubmit = array_flip($DimSubmit); $num = $DimSubmit['保存ボタン']; print "質問 No.{$num}から飛んできたよ。<hr>"; $back = "Quest{$num}"; print "質問 No.{$num}に戻るよ。<hr>\n"; print "<a href=q.php#{$back}>[ 戻る ]\n"; print "<form action='send.php#{$back}' method=post>\n"; print "<input type=submit value='戻る'>\n"; print "</form>\n"; ?> <body> </html> -----

nccno21
質問者

お礼

ご教示の方法ですと、正確には戻れませんよね? 各質問は等間隔ではありません。また、保存ボタンも1問ずつ設置しておりません。 どちらかというと標準サイズのモニタに表示可能な1画面に1つはボタンが見える感じです。 しかし、回答者はいつボタンを押すかわかりません。 (画面中央付近で回答中に、上部にあるボタンを押す人もいれば、下部にあるボタンを押す人もいる e.t.c...) よって、より正確に戻してやる必要があります。

関連するQ&A

  • PHPで、エラーがない場合のみ画面遷移させたい

    PHPのプログラムを作成しています。 動きとしては、 1.ユーザに値を入力させる 2.ユーザが入力した値をエラーチェックする 3.エラーチェック結果、もしエラーがなければ次の画面へ遷移し、エラーがあればメッセージを画面表示 という動きです。 (教えて!gooのような動きをさせたいのですが・・・) 2まではできていますが、3で困っています。 エラーがあればメッセージを画面表示するのはできましたが、エラーがない場合に次の画面へ移動する、というのはどのように実装すれば可能でしょう。 現在のソースは以下のような流れです。 ---------------------------------------------------------- <?php  $getChar = $_POST["char"] /*--- エラーチェック ---*/  if( isset( $_POST["send"] ) ) {   if( strcmp( $getChar, "" ) == 0 ) { // 空の場合はエラー   $strErr = "エラーメッセージ";   }   echo $strErr;  // ★  } ?> <form method="POST" action="#" name="form">  名前:<input type="text" name="char">  <input type="submit" name="send" value=\"送信\"> </form> ---------------------------------------------------------- 現在は上のような流れで処理を行っています。 今はエラーがある場合はエラーメッセージを表示(★部)し、ない場合はエラーメッセージを表示せず、画面遷移も行いません。 本当はエラーがない場合は次の画面へ遷移をさせたいのですが、どのように指定をさせたら良いのでしょうか。 すみませんが、ご回答よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • phpがうまく動きません。

    phpで4択のクイズを作りたいのですが 正解のラジオボタンを選んでもカウントされないのと 答え合わせを押すと正解だった箇所を赤く表示したいのですがなんて書けばよいのか どこにそのコードを入れるのかよくわかりません <状態> ・5つのデータがmyadminに保存されています ・データベースの内容は表示されます。 ・答え合わせを押すと正解のラジオボタンを選んだ数が表示されるようにしたいです ・保存ボタンは閉じても答えを保存するためにあります ・q_noは8ケタ固定であり、左から5つ目までは固定であと3桁は999問入れられるよう設定してあります ・q_ansはデータベースに答えの値(1~4)が入れてあります ・データベース名はproblemです <省略> $res_set = mysql_query($sql); while ($row=mysql_fetch_array($res_set)){ ?> <form method="POST" action="H2102.php"> <?php echo $row['q_no'] . " "; ?> <br> <?php echo $row['q_text'] . " "; ?><br><br> <br> <?php echo "ア"; ?> <input type="radio" name="q_ans" value="1"> <?php echo $row['q_point1'] . " "; ?> <br><br><br> <?php echo "イ"; ?> <input type="radio" name="q_ans" value="2"> <?php echo $row['q_point2'] . " "; ?> <br> <br><br> <?php echo "ウ"; ?> <input type="radio" name="q_ans" value="3"> <?php echo $row['q_point3'] . " "; ?> <br><br><br> <?php echo "エ"; ?> <input type="radio" name="q_ans" value="4"> <?php echo $row['q_point4'] . " "; ?> <br><br><br> <br> <input type = "submit" name="save" value="保存"> <?php if(isset($_POST['save'])){ $_SESSION['save'] = $_POST['q_ans']; //保存すると選んだ回答を保存 } ?> <?php } ?> </form> <form method="POST" action="H2102.php"> <input type = "submit" name="ans" value="答え合わせ"> <?php //正解かどうかをチェック if(isset($_POST['ans'])){ $a = $_SESSION['a']; if($row['q_no'] == $_POST['q_no'] && $_POST['q_ans'] || $_SESSION['save'] == $row['q_ans'] ){ $_SESSION['a'] = $a + 1; //q_noが一致かつ保存した値または選んだ解答(値)が一致していれば1問につき1つカウントする $a = $_SESSION['a']; } echo $a; //カウントされているかをチェック } ?> <input type = "submit" name="del" value="カウント初期化"> <?php if(isset($_POST['del'])){ session_unset(); } ?> </form> <br> <?php } ?> 足りない情報があれば追記します

    • 締切済み
    • PHP
  • php + javascriptで値の保持

    現在、ラジオボタンによるデータの受け渡しを調べているのですが submitボタンを使わずに、データ遷移がしたいと思い 色々やっているのですが上手く行きません。 これは実現可能なのでしょうか? <input type="radio" name="hoge" value="1" onclick="location.href='<?php echo $_SERVER['REQUEST_URI']; ?>'; test(this.value);" <?php echo $check1; ?>> <input type="radio" name="hoge" value="2" onclick="location.href='<?php echo $_SERVER['REQUEST_URI']; ?>'; test(this.value);" <?php echo $check2; ?>> <input type="radio" name="hoge" value="3" onclick="location.href='<?php echo $_SERVER['REQUEST_URI']; ?>'; test(this.value);" <?php echo $check3; ?>> 上記のソースの様な感じでとりあえずやってみましたが、 「ボタンを押したら即移動」は可能なものの、value値の保持が javascript上でどうやったらいいか分かりません。 ※$check1~3は遷移後のchcked判定の変数です ※test関数においてのvalueを格納する処理が分かりません やはり無難にsubmitボタン+セッション関数等で構築した方が良いのでしょうか?

    • ベストアンサー
    • PHP
  • phpのsubmit処理について

    phpのsubmit処理について不明点があります 実装したいことは ボタンを押したらフォームの入力内容を別フォームに表示したいのですが 別フォームに呼び出しはできたのですが ボタン押下時にsubmitで表示するかの確認をしたいです 現段階ではボタンを押すと確認アラートも出ず、ただ別フォームが表示される形になってしまいます <--関数--> function showData(){ myRet = confirm("表示しますか") if (myRet == true){ } } <--form--> <form name = "FileData" action = "show.php" method="POST"> <--button--> <input type = "submit" name ="Display" onClick "showData();" value="表示"> ソースの抜粋になります これで実行するとshow.phpが呼ばれて表示はされるのですが関数が呼ばれず確認アラートも呼ばれません すぐ実行されるというものになっていますます この現象の原因と何か解決などわかることがあればよろしくお願いします。

    • ベストアンサー
    • PHP
  • 画面遷移について

    早速質問なんですが、今 1.ホーム画面は地図(google Map)を表示、また画面遷移用のボタンを設置してある。 2.ボタンを押すとカメラを使う画面に遷移し、そこでとりあえず写真を撮る。(ここではカメラを実行するActivityと、SurfaceView を継承したクラスを別クラスにて実装しております。) 3.取った後に勝手に画面遷移させ(元のMap画面へ)、撮った写真の緯度、経度を取得したうえで現在地情報を表示させる。→表示させる際はFacebookなどにある、ピンをMap上に表示させるような感じで、さらにその場所の住所、画像も表示させる、といったイメージです。 このような仕様のアプリを作っております。簡単に言えば、写真を撮ったら現在地の情報がわかる!といったアプリです。 ここで、カメラ画面から元のMap画面に画面遷移させたいのですが、通常Activity間の画面遷移はIntentを使用するのが一般的ですが、この場合だとどのように実装すれば可能でしょうか? 自分としてはHandlerクラスのメンバをSurfaceView を継承したクラスで用意して、Activityに対してそのクラスを呼び出すコードを実装すれば行けるのかなぁ…と考えているのですが。 初対面でいきなりの質問で誠に申し訳ございませんが、ご回答お待ちしております。 必要であればプログラムコードもお送りいたします。よろしくお願いいたします。

    • ベストアンサー
    • Java
  • PHPでのフォームバリデートと値保持について

    いつもお世話になってます。PHP+Apache(+MySQL)の環境です。 フォーム(ラジオ、チェック、プルダウン、テキスト)に入力された内容をチェックし,すべて正しければ確認画面、間違いがあればフォーム画面にもどるが、その際、正しい項目の入力内容は保持したまま、さらに、間違いの項目に対して、エラーの内容を各項目のところ(ページ上部にまとめて表示するのではなく)に表示したいです。 要は、フォームの各種要素の値を保持する方法 と 入力規則の各種(値有無、条件合致等)チェックとフラグ表示をしたいです。 フォーム入力 └値有無チェック   ├全てあたいがあれば─内容確認┬送信(完了)   │                    └もどって修正(値保持したまま)   └値抜け、違反(チェックボックスで指定選択数オーバー、文字数オーバー等)があれば・・・      └入力画面にもどる(正しい項目は値保持、間違っている部分にはエラー内容のフラグ表示) <状況>フォームから値を受信し、空白の場合に当該項目に”未回答です!!”というメッセージを表示するところまでできています。違反なく入力されたところにメッセージは表示されませんが、値が消えます(保持されません)。 #vali.php if(!isset($_POST['exec'])){ include('temp/anc.php'); exit; } if(isset($_POST['exec'])){ function HTMLsc($str){中身省略します} $ErrorMsg = array(); $ErrorCnt = 0; for($i=1; $i<5; $i++){ $num = "q".$i; $$num = HTMLsc($_POST["$num"]); if(empty($$num)){ $ErrorMsg["$i"] = "未回答です"; $ErrorCnt++; }else{ /*この部分に作り込むのかなぁ?*/ } } if($ErrorCnt != 0){ include('temp/anc.php'); exit; } include('temp/comp.php'); } ----------- #anc.php <!-- 項目ごとに簡単に記述します --> <? if(isset($ErrorMsg[1])){echo $ErrorMsg[1];}?> <h3>問1.元気ですか?</h3> <input type="radio" name="q1" value="1">はい <input type="radio" name="q2" value="2">いいえ <? if(isset($ErrorMsg[1])){echo $ErrorMsg[1];}?> <h3>問2.朝なに食べた?</h3> <input type="checkbox" name="q2[]" value="1">ごはん <input type="checkbox" name="q2[]" value="2">パン <input type="checkbox" name="q2[]" value="3">みそ汁 <input type="checkbox" name="q2[]" value="4">牛乳 <? if(isset($ErrorMsg[1])){echo $ErrorMsg[1];}?> <h3>問3.起きてまず何する?</h3> <select name="q3"> <option value="1">顔洗う</option> <option value="2">歯磨く</option> <option value="3">ぼーっとする</option> </select> <input type="checkbox" name="q2[]" value="4">牛乳 <? if(isset($ErrorMsg[4])){echo $ErrorMsg[4];}?> <h3>問4.なんか書いて</h3> <input type="text" name="q4" value="<?php echo $_POST["q4"];?>"> <input type="submit" name="exec" value="終了・確認"> ※ラジオボタンの数、チェックボックスの数、プルダウン項目数は変化に耐えうる構造がよいです。参考サイトの紹介でもOKです。結構探しましたが単独での参考しかありませんでした

    • ベストアンサー
    • PHP
  • inputタグでphpを呼び出す際、ページ遷移せずに実行結果を呼び出す方法が分かりません

    phpのプログラムで数点詰まってしまった所がございましたので、アドバイスいただける方がいらっしゃいましたら、よろしくお願いします。 【やりたいこと】 1. index.phpのactionというボタン(inputタグ)を押すと、action.phpの中身を実行したい(これは出来ています)。 2. その際、ブラウザのURLはaction.phpではなく、index.phpにしたい(これは出来ていません。index.phpにaction.phpの実行結果を読み込めばよいのかなと思いましたが、その方法が分かりませんでした)。 3. index.phpのactionというボタンを押すと表示される画面に、「戻る」ボタンを表示したい(これは出来ていません。action.php内に「戻る」ボタンを記述した所、action.phpを正常に実行した際は「戻る」ボタンが表示されましたが、異常時には「戻る」ボタンが表示されませんでした。なおindex.phpに最初にアクセスした際には「戻る」ボタンは表示させたくありません)。 【ソースコード】 ※phpが動作するサーバの同一階層内に、下記のindex.php、action.phpをアップしていただければ、動作を確認していただけると思います。 ★index.php <html> <head> <title>action</title> </head> <body> <form action="action.php" method="post" enctype="application/x-www-form-urlencoded"> <input type="submit" name="Submit" value="action" /> </form> </body> </html> ★action.php <?php phpinfo(); ?> どこか一箇所でもアドバイスいただけるようでしたら、アドバイスいただければと思います。 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 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"]."です"; という感じで、どのボタンがクリックされたか判別するために、 ボタンの値を取得したいのですが。 よろしくお願いします。

  • FORMで送信ボタンと戻るボタンを2つつけてそれぞれ遷移先を変えたい

       以下のような画面を作りたいのですが↓ -------------------------------------------------------------------------------- ● a.php (ユーザ情報入力画面) ※フォームに入力する画面    <FORM method="POST" action="b.php">   <INPUT type="text" name="mail">   <INPUT type="submit" name="submit" value="確認">  </FORM> ● b.php (ユーザ情報入力確認画面)※フォームに入力された値を表示する画面  <FORM method="POST" action="c.php">   <!-- ここには、フォームに入力された値を表示する -->   <INPUT type="submit" name="submit" value="登録"> // c.php に遷移する   <INPUT type="submit" name="submit" value="戻る"> // a.php に戻る  </FORM> ● c.php (完了画面) -------------------------------------------------------------------------------- b.php について質問なのですが、 b.phpにおいて、登録ボタンと戻るボタンを2つつけて、 それぞれ遷移先を変えたいのですが、どうすればいいんでしょうか・・・? <FORM method="POST" action="c.php">と書いてしまうと、 戻るボタンを押しても戻らずに、c.phpに遷移してしまいますよね?? こういう場合ってJavaScriptとかで遷移先を指定するんですか・・? もしそうでしたら、JavaScriptがよくわからないので できればサンプルコード示していただけると助かります・・・。   

  • PHPを使ってのWebサイト構築:Submitしたときに次画面が描画されない。

    Apatch、PHP4、PostgreSQLを使ってWebサイトの開発をしています。ブラウザはIE6を使用。NNを使用するとこの事象は発生しませんでした。 ●仕様  ・A.php → B.php → C.php という遷移をFormをSubmitすることによって行います。  ・Aでは、入力フォームがあり、そこでユーザは情報を入力して、Submitボタンを押下し、Bへ遷移します。入力した値はPOSTで渡されます。  ・Bでは、Aから渡された値を画面表示するときに受け取った値を確認のために表示。同時バックグラウンドで、Input type hidden のタグに値を渡し、そのFormをSubmitすることによりCへ遷移。(受け取った値をそのままCへPOSTで渡す。)  C・では受け取った値をDBに登録し、登録終了画面を表示する。 ●不具合  BからCへ遷移するとき、画面が反映されない。 ○不具合詳細  ・BからCへのSubmitボタンを押下するとブラウザ下部のステイタスバーにはプログレスバーが延びていき、「ページが表示されました」となるにもかかわらず、画面はBの状態のままである。さらにブラウザ上部のURL入力部にはC.phpのURLが入っている。  ・DBには値が反映されている。(CのPHP処理は正常におこなわれているらしい)  処理終了後に画面のどこか(どこでもよい)を一回クリックするとぱっとCの画面が表示される。(何もしないとずっとBのままである。)  ・Bの画面のままのときに、Submitボタンをもう一度押すことが出来、二度目のアクセスにいってしまう。(当システムの場合、これを行うと一意規約違反でエラーとなる。)  ・AからBではこの現象はおきない。   ・毎回なるわけではなく、4回に1回くらいは正常な動作をする。 ●環境 サーバOS:RedHatLinux Webサーバ:Apatch DB:PostgreSQL7.1 実装言語:PHP4 ブラウザ:IE6(NNではならない) 対処法のわかるかた、いらっしゃいましたらお願いします。

    • ベストアンサー
    • PHP