 
                
                        読み込みが終了しない場合は、しばらく待つか、リロードを行なってください。
                    
                    
                        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>