JavaScriptで特定の部分だけを非同期処理でリロード(更新)する方法

JavaScript

jQueryを使わずにVanilla JS(バニラ・ジェイエス)で非同期処理を行う便利な小技を紹介します!
あるwebコンテンツのなかで、コンテンツ内の特定の部分(1箇所)だけを変更したいのにブラウザ全体をリロードをしてしまうと、そのページ全体がリロードされてしまいます。このやり方だと、リロードする必要のない不要な箇所をもう一度ダウンロードしなくてはならないので、余計なリクエストが発生しますよね。こういった特定の箇所、1部分だけをリロードさせたいときはJavaScriptの非同期処理で簡単に実現できます!この記事内のサンプルコードをコピペしてお試しください。

Vanilla JS(バニラ・ジェイエス)とは

Vanilla JSとはフレームワークも使わず JS を書くこと

JavaScriptは様々なライブラリ・フレームワークが存在します。何のライブラリもフレームワークも使わないで書いたJavaScriptのことをVanilla JS(バニラ・ジェイエス)と呼びます。「生JS (ナマ・ジェイエス)」や「素のJS」とも呼ばれたりします。要するにライブラリやフレームワークに頼らずに、本来のJavaScriptの機能だけで完結しよう!っていう感じです。たとえばjQuery(ジェイクエリー)はとても扱いやすく便利なのですが、JavaScriptの仕様がアップデートして多くの機能追加された昨今では、脱jQueryを推奨している現場もあるようです。ワタシもjQueryを使うのをやめました(卒業しました)。理由としては
「querySelectorが使えるようになった」
「jQueryの読み込みリクエスト数が増えるのが嫌だ」
「なんかプラグインとかフレームワークは面倒くさい」
「Vanilla JSで書くとなんか、カッコ良い」
などなどの理由ですかね。というわけで、当サイトでは全てのJavaScriptのコードはVanilla JS(バニラ・ジェイエス)で書いているので、他のJavaScript関連の記事も参考にしてみてください。

非同期処理とは

なにかの処理の終わりを待たずに、別の処理を実行することを

ざっくりいうと、なにかのデータをリクエストしたら、その結果を待って順番に処理をすることを同期処理という。これに対し、データをリクエストしたら、その結果を待たずに、別の処理を進めることを非同期処理という。
もっとざっくりいうと、同期処理というのは、炊飯器でご飯が出来上がった後に、カレーを作り出す状態ということで、非同期処理というのは、炊飯器でご飯を炊きながら、カレーを作っている状態のことです。
ご飯ができあがるまで、カレーを作ることができない同期処理と比べると、非同期処理の方が効率が良い、ということが分かると思います。

fetch(フェッチ)を使う

非同期処理をしたいならfetch(フェッチ)を使う

前置きが長くなりましたが、実際のコードを見て、コピペしてみてください!

今回は非同期処理の動きを視覚的にわかりやすくするため「0〜10」の数値をランダムで表示します。ファイル名は「refresh.php」としています。phpを使う理由はボタンを押す毎に特定の部分(1部分)のみをランダムで数値を変化させるため。このファイルをご自身のサーバにUPしてください。


<div class="wrap">
    <p class="refresh">ここだけ「fetchでリロード」 → <?php echo rand(0, 10); ?></p>
    <p class="no_refresh">ここは「fetchリロードが影響しない」 → <?php echo rand(0, 10); ?></p>
</div>

<button id="fetchReload">fetchでリロード</button>
<button id="browserReload">ブラウザをリロード</button>

<script>
document.addEventListener('DOMContentLoaded', function() {

    //ブラウザをリロード
    const browserReload = document.getElementById('browserReload');
    browserReload.addEventListener('click', function(){
        
        console.log("5秒後にブラウザをリロードする準備");
        setTimeout(function(){
            console.log("リロードします!");
            location.reload();//ブラウザをリロードする
        },5000);//5秒
    });

    //fetchでリロード
    const fetchReload = document.getElementById('fetchReload');
    
    fetchReload.addEventListener('click', function() {
        fetch('refresh.php')
            .then(response => response.text())
            .then(data => {
                // 新しい要素を作成
                let tempDiv = document.createElement('div');
                tempDiv.innerHTML = data;
                let reloadedElement = tempDiv.querySelector('.refresh');
                
                if (reloadedElement) {
                    // 既存の要素を置き換える
                    let existingElement = document.querySelector('.refresh');
                    existingElement.parentNode.replaceChild(reloadedElement, existingElement);
                } else {
                    alert("要素の取得に失敗しました");
                }
            })
            .catch(error => {
                alert("リクエストエラー: " + error);
            });
    });
});
</script>

上記をコピペした「refresh.php」ファイルをサーバにUPした後ページにアクセスして「fetchでリロード」ボタンを押すことで0〜10までのランダム数値が変化するはずです。これが非同期処理ということで特定の部分(1部分)だけをリロード(更新)するということです。そして「ブラウザをリロード」ボタンを押すと、5秒後にページ全体がリロードするので、2つのランダム数値が変化するはずです。
ページ全体をリロードすると現在のページの状態が破棄されて、新しいページの読み込みが開始されます。ページの読み込みが完了するまでは他の処理を待っている状態となり、処理が終わるまで「ブラウザをリロード」ボタンを押して(連打して)も5秒間は処理がブロックされます。これが、いわゆる同期処理です。これに対し非同期処理の場合はページの読み込みが完了するまでの5秒間の待機時間を待たずに「fetchでリロード」ボタンを押すことが可能で、特定の部分(1部分)だけをリロード(更新)することができます。
↓こちらの動画(gifアニメ)は「refresh.php」ページを実行しています。参考にしてみてください。

まとめ

  • Vanilla JSとはフレームワークも使わずにJavaScriptを書くことである
  • Vanilla JSは「生JS」「素のJS」と呼ばれる場合がある
  • 非同期処理はfetch(フェッチ)が便利
  • JavaScriptの仕様アップデートによってjQueryを卒業しても問題ない
  • 特定の部分(1部分)を非同期処理することで全体をリロードする必要がなくなる