毎日コーディングクイズシリーズ!今回はJavaScriptのDOM操作について、実践的なクイズ形式で学習しましょう!
🎯 問題
あなたはECサイトのショッピングカート機能を実装しています。商品の数量を変更する際に、数量が変わったタイミングで合計金額を自動更新する必要があります。
<div class="cart-item" data-price="1200">
<span class="product-name">コーヒー豆</span>
<input type="number" class="quantity-input" value="1" min="1">
<span class="item-total">1200</span>円
</div>
<div class="cart-total">
合計:<span id="total-price">1200</span>円
</div>
数量の入力フィールドが変更されたときに、リアルタイムで商品の小計と合計金額を更新するJavaScriptコードを実装したいと思います。最も適切な実装方法はどれでしょうか?
A. onclick イベントを使用してクリック時に更新する
B. onchange イベントを使用してフォーカスが外れた時に更新する
C. oninput イベントを使用してリアルタイムで更新する
D. onblur イベントを使用して入力完了時に更新する
B. onchange イベントを使用してフォーカスが外れた時に更新する
C. oninput イベントを使用してリアルタイムで更新する
D. onblur イベントを使用して入力完了時に更新する
答えを確認する
✅ 正解:C
正解
正解は C. oninput イベントを使用してリアルタイムで更新する です!
解説
oninput イベントは、input要素の値が変更された瞬間に発火するイベントです。ユーザーがキーを押したり、スピナーボタンをクリックしたりするたびに即座に反応するため、リアルタイムでの価格更新に最適です。
- 選択肢A: onclick イベントは要素がクリックされた時のみ発火するため、キーボード入力での数量変更を検知できません。numberタイプの入力フィールドでは不十分です。
- 選択肢B: onchange イベントは値が変更されてからフォーカスが外れた時に発火するため、リアルタイム更新には適していません。ユーザーが入力中に価格を確認したい場合に対応できません。
- 選択肢C: 【正解】oninput イベントは入力値が変更された瞬間に発火するため、リアルタイムでの価格更新に最適です。ユーザーエクスペリエンスが大幅に向上します。
- 選択肢D: onblur イベントは要素からフォーカスが外れた時のみ発火するため、入力中の値の変更を検知できません。リアルタイム更新には不向きです。
ECサイトのような商用サイトでは、ユーザーが数量を変更する際に即座に価格が更新されることで、購入の意思決定をサポートできます。また、入力エラーがあった場合も素早く気づけるため、ユーザビリティの向上にも繋がります。
document.querySelector('.quantity-input').addEventListener('input', function(e) {
const quantity = parseInt(e.target.value);
const cartItem = e.target.closest('.cart-item');
const price = parseInt(cartItem.dataset.price);
const itemTotal = cartItem.querySelector('.item-total');
// 商品の小計を更新
const subtotal = price * quantity;
itemTotal.textContent = subtotal;
// 合計金額を更新
updateTotalPrice();
});
function updateTotalPrice() {
const allTotals = document.querySelectorAll('.item-total');
let total = 0;
allTotals.forEach(item => {
total += parseInt(item.textContent);
});
document.getElementById('total-price').textContent = total;
}
このコードでは、入力値が変更されるたびに商品の小計と合計金額が自動的に更新されます。ユーザーは入力と同時に価格変更を確認できるため、より良いショッピング体験を提供できます。
💡 ポイント
- oninput イベントは値の変更を即座に検知するため、リアルタイム更新に最適
- onchange イベントはフォーカスが外れた時に発火するため、完了時の処理に適している
- parseInt() を使用して文字列を数値に変換し、計算処理を正確に行う
- closest() メソッドで親要素を取得し、効率的にDOM操作を行う