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部分)を非同期処理することで全体をリロードする必要がなくなる