PHPでシステムのモックを作っていると、いちいち画面遷移をして処理することがユーザービリティを下げていることに気付いた。
なので、今回はAjaxの非同期通信を使って、画面遷移することなくフォームの内容を送信し、PHPでリアルタイム処理する方法をメモとして残しておく。
Table of Contents
jQuery側で定義する処理
まずは非同期通信を行うために、jQueryでの処理を書いていく。
今回は非同期通信を行うことが目的なので、フォームや処理を行うPHPの内容は省略するが、イメージは下記の記事でも作ったフォームを使うと考えてオッケーだ。
【JS】イベントリスナー、ループ、クロージャを組み合わせてボタンを制御する
$(document).ready(function() { //ページの読み込みが完了するまでコードの実行を待つ
$('.myForm').on('submit', function(event) { //.on()メソッドでsubmitのイベントが発生したときに実行。
//上記event引数はイベント発生時にイベントハンドラが自動で生成し、引数として渡されれる。そしてそのイベントはsubmit イベントに関連する情報を含んでいるものとして定義されている
event.preventDefault(); // eventオブジェクトのpreventDefault() メソッドを使い、デフォルトの動作(今回はsubmitでのフォーム送信)を停止
// Ajaxを使用してフォームデータを非同期に送信
$.ajax({ //非同期通信(Ajax)を行うための関数
url: 'save.php', // リクエストを送るURL
type: 'GET', // リクエストの種類('GET'、'POST'など)
data: $(this).serialize(), //フォームデータをシリアライズ(要素を文字列化してURLエンコード)。フォームデータを簡単にサーバーに送信する
//↑フォーム内のすべての入力要素(テキストボックス、チェックボックス、ラジオボタン、など)からデータを取得し、それをURLエンコードした文字列として $.ajax() メソッドに渡す
success: function(response) { //response という引数は、$.ajax() 関数によって自動的に提供される。
//success 関数内で response を使うことで、サーバーから返されたデータにアクセスできる。このデータは、通常、サーバーが行った処理の結果や、新たに生成されたデータなどが含まれる
console.log(response); // // 成功時の処理。デバッグ用にレスポンスをコンソールに出力
alert('保存に成功しました。');
},
error: function(xhr, status, error) {
//xhrは404などのステータスコードやレスポンスを、statusはリクエストタイムアウトや中断などの状態、errorはサーバーから返されるNot Foundなどのエラーを表す
//success と errorまたは failのようなコールバック関数はajaxでよく使われる
console.log(error); // エラー時の処理。デバッグ用にエラー情報をコンソールに出力
alert('保存に失敗しました。');
}
});
});
});
例のごとく、大量のコメントアウトで解説は書いているので、そちらを読んでもらいたい。
Ajaxでの処理フロー
上記のコードでは主に下記のような流れで処理が行われている。
- ①$(document).ready(function() で処理を実行
- ②.on()メソッドでイベントが発生したとき(今回はsubmit押したとき)に実行
- ③Ajaxの関数を使い、urlやtypeを指定し、フォームデータをシリアライズ化
- ④戻ってきたresponseを使い、思考失敗の処理を書く
上記のようにすれば、サーバーに通信を行い、③で指定した処理を行うファイル(save.php)を使って処理を行うことが可能になる。
DBを確認してもしっかりとテーブルにデータが入っていたので、上記でフォームの非同期通信を行えばひとまず成功する。