読み込みが終了しない場合は、しばらく待つか、リロードを行なってください。
If loading does not finish, wait for a while or reload.
エンジニア向けの情報を発信するブログです。
どなたでも発信できます。
お好きに利用していただれば幸いです。
📁 root/view/index.php <?php global $params; $post_path = Route::createRouteUrl('/post'); ?> <div> <label for="text1">テキスト1</label> <input type="text" id="text1" name="text" data-post_path="<?php echo $post_path; ?>"> </div> <div> <label for="text2">テキスト2</label> <input type="text" id="text2" name="text" data-post_path="<?php echo $post_path; ?>"> </div> <div style="display: flex;"> <div>タイマー: </div> <div id="timer"> 3<!--insert_timer_js--> </div> </div> <ul id="insert_js"> <!--insert_js--> </ul> <script> $(function () { // 入力後通信までの秒数 const timer_default_count = 3; // 入力文字数最低文字数 const text_length = 3; // ajaxの結果受け取り用変数 let jqxhr; // サーバーから返された値を表示する要素 let insert_elem = $('#insert_js'); // inputフォーム1 let text_elem1 = $('#text1'); // inputフォーム2 let text_elem2 = $('#text2'); // 入力後通信までの秒数を表示する要素 let timer_elem = $('#timer'); // setTimeoutのid用変数 let timeout_id = null; // 入力後通信までの秒数を動的に表示するための変数 let timer_count = timer_default_count; // setIntervalのid用変数 let interval_id = null; // text_formの1と2を区別する用変数 let form_type = null; // text_formの1に入力があったら(時間差で通信するフォーム) text_elem1.on('keyup', function () { // setTimeoutが実行中だったらカウントダウンをストップする ajaxClearTimeoutId(); // 入力フォームの値をtextにセット let text = $(this).val(); // 送信先のurlをurlにセット let url = $(this).data('post_path'); // textが空もしくは規定の文字数以下の場合は if ( text === '' || text === null || text.length < text_length ) { // ajax通信するまでのカウントダウンアニメーションをリセットする resetTimerCount(); // 検索結果表示場所をクリアする cleanUpResult(); return false; } // サーバーに送るパラメータをセットするFormDataをnew let data = new FormData(); // FormDataのインスタンスにtextをセット data.append('text', text); // 時間差でajax通信するか判断するためform_typeに1をセット form_type = 1; // setTimeout関数で時間差でajax通信を実行する ajaxSetTimeoutId(url, data, form_type); }); // text_formの2に入力があったら(時間差を使用しないフォーム) // 途中まで上記に同じ text_elem2.on('keyup', function () { ajaxClearTimeoutId(); let text = $(this).val(); let url = $(this).data('post_path'); if ( text === '' || text === null || text.length < text_length ) { resetTimerCount(); // 時間差を使用しないので分かりやすくするためにcleanUpResult関数は実行しない return false; } let data = new FormData(); data.append('text', text); form_type = 2; // 時間差を使用しないのでそのままajax通信処理を実行 doAjax(url, data, form_type); }); // 検索結果表示を削除する function cleanUpResult () { insert_elem.empty(); } // ajax通信を時間差で実行する function ajaxSetTimeoutId (url, data, form_type) { // ajax通信までの時間をカウントダウンする countDown(); // setTimeoutの返り値のidをtimeout_idにセット timeout_id = setTimeout(function () { // ajax通信を実行 doAjax(url, data, form_type); }, 3000);// 3秒後に実行 } // ajax通信をするためのsetTimeoutが実行中の場合、ストップする function ajaxClearTimeoutId () { if (timeout_id !== null) { clearTimeout(timeout_id); // timeout_idをリセット timeout_id = null; } } // ajax通信処理 function doAjax (url, data, form_type) { // ajax通信中の場合ajax通信をストップする if (jqxhr) { jqxhr.abort(); } // ajax通信処理の返り値をjqxhrにセット(↑これで上記の条件分岐ができる) jqxhr = $.ajax({ type: 'POST', url: url, data: data, processData: false, contentType: false, dataType: 'json', timeout: 10000, }).done(function (data) { // 分かりやすくするため、text_form1の場合だけ検索結果をリセットする if (form_type === 1) { cleanUpResult(); } // 検索結果を表示する for (let i = 0;data.length > i;++i) { insert_elem.append('<li>' + data[i] + '</li>'); } }).fail(function (x,s,e) { // 通信失敗時は検索結果をリセットする cleanUpResult(); console.log(x,s,e); }); } // 入力からajax通信するまでの時間を表示する処理 function countDown () { timer_count = timer_default_count; ajaxClearIntervalId(); timer_elem.empty(); timer_elem.append(timer_count); interval_id = setInterval(function () { if (timer_count <= 0) { return false; } timer_count -= 1; timer_elem.empty(); timer_elem.append(timer_count); }, 1000); } // 上記のsetInterval関数をストップしてタイマーの表示を初期値にリセットする処理 function resetTimerCount () { ajaxClearIntervalId(); timer_count = timer_default_count; timer_elem.empty(); timer_elem.append(timer_count); } // タイマーをストップする処理 function ajaxClearIntervalId () { if (interval_id !== null) { clearInterval(interval_id); } } }); </script>
📁 root/api/post.php <?php global $http_method; global $params; // ajax通信ではなかったら404を表示して処理終了 if ( !isset($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest' ) { echo '404'; die; } // postメソッドではない場合エラーコードを返す if (strtolower($http_method) !== 'post') { header('HTTP/1.1 500 Internal Server Bad Request'); header('Content-Type: application/json; charset=UTF-8'); die(json_encode(array('message' => 'ERROR', 'code' => 500))); } // 送られてきたtextパラメータを$textにセット $text = null; if (isset($params['text'])) { $text = $params['text']; } // 検索用文字の配列 $words = [ 'あ', 'あい', 'あいう', 'あいうえ', 'あいうえお', 'か', 'かき', 'かきく', 'かきくけ', 'かきくけこ', ]; // $textの文字が入っている文字列を取得して$responseに格納 $response = []; if (!is_null($text)) { foreach ($words as $word) { if (strpos($word, $text) !== false) { $response[] = $word; } } } // 検索結果を返して処理終了 header("Content-type: application/json; charset=UTF-8"); echo json_encode($response); exit;
text_elem2.on('keyup', function () { ajaxClearTimeoutId(); ........
// ajax通信処理 function doAjax (url, data, form_type) { // ajax通信中の場合ajax通信をストップする if (jqxhr) { jqxhr.abort(); } // ajax通信処理の返り値をjqxhrにセット(↑これで上記の条件分岐ができる) jqxhr = $.ajax({ .......
if (jqxhr) { jqxhr.abort(); }
// textが空もしくは規定の文字数以下の場合は if ( text === '' || text === null || text.length < text_length ) { // ajax通信するまでのカウントダウンアニメーションをリセットする resetTimerCount(); // 検索結果表示場所をクリアする cleanUpResult(); return false; }
<?php global $params; $post_path = Route::createRouteUrl('/post'); ?> <div> <label for="text">テキスト1</label> <input type="text" id="text1" name="text" data-post_path="<?php echo $post_path; ?>"> </div> <ul id="insert_js"> <!--insert_js--> </ul> <script> $(function () { // 入力後通信までの秒数 const timer_default_count = 3; // 入力文字数最低文字数 const text_length = 3; // ajaxの結果受け取り用変数 let jqxhr; // サーバーから返された値を表示する要素 let insert_elem = $('#insert_js'); // inputフォーム1 let text_elem1 = $('#text1'); // setTimeoutのid用変数 let timeout_id = null; // text_formの1に入力があったら(時間差で通信するフォーム) text_elem1.on('keyup', function () { // setTimeoutが実行中だったらカウントダウンをストップする ajaxClearTimeoutId(); // 入力フォームの値をtextにセット let text = $(this).val(); // 送信先のurlをurlにセット let url = $(this).data('post_path'); // textが空もしくは規定の文字数以下の場合は if ( text === '' || text === null || text.length < text_length ) { // 検索結果表示場所をクリアする cleanUpResult(); return false; } // サーバーに送るパラメータをセットするFormDataをnew let data = new FormData(); // FormDataのインスタンスにtextをセット data.append('text', text); // setTimeout関数で時間差でajax通信を実行する ajaxSetTimeoutId(url, data); }); // 検索結果表示を削除する function cleanUpResult () { insert_elem.empty(); } // ajax通信を時間差で実行する function ajaxSetTimeoutId (url, data) { // setTimeoutの返り値のidをtimeout_idにセット timeout_id = setTimeout(function () { // ajax通信を実行 doAjax(url, data); }, timer_default_count * 1000);// 3秒後に実行 } // ajax通信をするためのsetTimeoutが実行中の場合、ストップする function ajaxClearTimeoutId () { if (timeout_id !== null) { clearTimeout(timeout_id); // timeout_idをリセット timeout_id = null; } } // ajax通信処理 function doAjax (url, data) { // ajax通信中の場合ajax通信をストップする if (jqxhr) { jqxhr.abort(); } // ajax通信処理の返り値をjqxhrにセット(↑これで上記の条件分岐ができる) jqxhr = $.ajax({ type: 'POST', url: url, data: data, processData: false, contentType: false, dataType: 'json', timeout: 10000, }).done(function (data) { cleanUpResult(); // 検索結果を表示する for (let i = 0;data.length > i;++i) { insert_elem.append('<li>' + data[i] + '</li>'); } }).fail(function (x,s,e) { // 通信失敗時は検索結果をリセットする cleanUpResult(); console.log(x,s,e); }); } }); </script>