具体例で示すJAVASCRIPTの使い方

目次

はじめに

今回は JavaScript について超基本を勉強したので、それを記事にしました。

これまで HTML は少し触ったことがあっても、JavaScript は「名前は知っているけれど、実際にどう使うのかよく分からない」という状態でした。
ですが実際に触ってみると、HTMLの表示を書き換えたり、入力チェックをしたり、選択内容に応じて表示を変えたりと、Web画面を動かすための大事な役割を持っていることが分かりました。

今回は、まずは本当に基本的なところとして、

  • HTMLの文字を書き換える
  • HTML要素を取得する
  • 入力値を使って画面を変える
  • 日付チェックや必須チェックを行う

といった内容を、具体例を交えながらまとめてみます。


JavaScriptとは

JavaScript は、Webページに動きを付けるためのプログラミング言語です。

HTML は画面の部品を作る役割、CSS は見た目を整える役割がありますが、JavaScript はその上で、

  • ボタンを押したときに処理をする
  • 入力された値をチェックする
  • 選択内容に応じて表示を切り替える
  • 画面の内容を書き換える

といったことができます。

つまり、「表示するだけのページ」から「利用者の操作に反応するページ」にするための仕組みが JavaScript だと理解しました。


0.Hello World!!

まずは一番基本的な例です。
HTMLファイルの p タグを、script により 「Hello World!!」という文字列に置き換えて表示します。

サンプルソース

<body>
<p>ここを書き換える</p> <script>
document.querySelector('p').textContent = 'Hello World!!';
</script>
</body>

説明

この例では、最初は p タグの中に「ここを書き換える」と書いてありますが、JavaScript によって実行時に「Hello World!!」へ変更しています。

document.querySelector('p').textContent = 'Hello World!!';

この1行は、次のような意味です。

  • document.querySelector('p')
    → 最初の p タグを取得する
  • .textContent = 'Hello World!!'
    → そのタグの文字列を Hello World!! に変更する

JavaScript を使うと、このように HTMLの内容をあとから書き換えられる ことが分かりました。


1.HTML要素を取得する

JavaScript で画面を操作するには、まず どの部品を操作するのか を取得する必要があります。
これが「HTML要素を取得する」ということです。

よく使う書き方は次のようなものです。

document.getElementById('abc');
document.querySelector('#abc');
document.querySelector('p');

それぞれの意味

  • document.getElementById('abc')
    id="abc" が付いた要素を取得する
  • document.querySelector('#abc')
    → CSSセレクタ形式で id="abc" の要素を取得する
  • document.querySelector('p')
    → 最初の p タグを取得する

個人的には、id があるなら getElementById() が分かりやすい と感じました。
一方で querySelector() は、#id.classp など柔軟に書けるので便利そうです。


2.値を取得する・設定する

HTML要素を取得したら、その要素の値や文字列を取得したり設定したりできます。

例えば次のようなものがあります。

element.value;
element.textContent;
element.innerHTML;

主な使い分け

  • value
    → 入力欄やコンボボックスの値を取得するときに使う
  • textContent
    → 要素の文字列を書き換えるときに使う
  • innerHTML
    → HTMLごと書き換えるときに使う

例えば、テキスト入力欄の値を取りたい場合は value を使います。

const name = document.getElementById('userName').value;

画面上のメッセージを変更したい場合は textContent を使います。

document.getElementById('message').textContent = '入力してください。';

3.イベントで処理を動かす

JavaScript では、ボタンを押した時や選択が変わった時などに処理を実行できます。
これを イベント と呼びます。

例えば、値が変わった時に処理をしたい場合は次のように書きます。

element.addEventListener('change', function () {
// 値が変わった時の処理
});

よく使うイベントには次のようなものがあります。

  • click
    → ボタンを押した時
  • change
    → 選択肢や入力値が変わった時
  • input
    → 文字入力の途中でも反応したい時

たとえば、ボタンを押したらメッセージを表示する例はこのように書けます。

document.getElementById('checkButton').addEventListener('click', function () {
document.getElementById('message').textContent = 'ボタンが押されました。';
});

4.条件分岐

入力された値によって処理を変えたい場合は、if を使います。

if (条件) {
// 条件が正しい時
} else {
// 条件が違う時
}

例えば、入力欄が空かどうかを確認する場合は次のように書けます。

if (userName.value.trim() === '') {
message.textContent = '名前は必須です。';
} else {
message.textContent = '入力されています。';
}

trim() は、前後の空白を除去してくれるので、必須チェックではよく使いそうだと思いました。


5.繰り返し

同じような処理を何回も行う場合は、for を使って繰り返します。

for (let i = 0; i < 5; i++) {
// 5回繰り返す
}

たとえば、配列の中に入っているデータを順番に処理したい時に便利です。

const fruits = ['りんご', 'みかん', 'バナナ'];for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}

今回のサンプルでも、コンボボックスの選択肢を追加する時に繰り返しを使っています。
配列の数だけ option を作る、というような処理は実務でもよくありそうだと感じました。


今回学んだことをまとめたサンプルHTML

ここでは、今回学んだ内容をまとめたサンプルHTMLを載せておきます。
このサンプルでは、以下のような動きをまとめて確認できます。

  • ラジオボタンの選択でコンボボックスの内容が変わる
  • コンボボックスの選択によってメッセージが変わる
  • 日付入力のフォーマットチェック
  • 期間入力の大小チェック
  • ボタン押下時の必須入力チェック

サンプルソース


<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>JavaScript基本サンプル</title>
  <style>
    body {
      font-family: sans-serif;
      line-height: 1.8;
      margin: 20px;
    }

    .error {
      color: red;
      font-weight: bold;
    }

    .info {
      color: blue;
      font-weight: bold;
    }

    .block {
      margin-bottom: 20px;
      padding: 10px;
      border: 1px solid #ccc;
    }

    label {
      margin-right: 10px;
    }
  </style>
</head>
<body>

  <h1>JavaScript 基本サンプル</h1>

  <!-- JavaScriptで書き換える対象 -->
  <p id="titleMessage">ここを書き換える</p>

  <div class="block">
    <h2>1. ラジオボタンでコンボ内容を変更</h2>

    <!-- name が同じラジオボタンは1つだけ選択できる -->
    <label>
      <input type="radio" name="category" value="fruit" checked>
      果物
    </label>

    <label>
      <input type="radio" name="category" value="drink">
      飲み物
    </label>

    <br><br>

    <!-- コンボボックス -->
    <select id="itemSelect">
      <!-- JavaScriptで中身を入れる -->
    </select>

    <p id="itemMessage" class="info">選択内容に応じてここが変わります。</p>
  </div>

  <div class="block">
    <h2>2. 日付入力チェック</h2>

    <label for="dateInput">日付(YYYY-MM-DD):</label>
    <input type="text" id="dateInput" placeholder="例: 2026-03-01">

    <button type="button" id="dateCheckButton">日付チェック</button>

    <p id="dateError" class="error"></p>
  </div>

  <div class="block">
    <h2>3. 期間の大小チェック</h2>

    <label for="startDate">開始日:</label>
    <input type="text" id="startDate" placeholder="例: 2026-03-01">

    <label for="endDate">終了日:</label>
    <input type="text" id="endDate" placeholder="例: 2026-03-31">

    <button type="button" id="periodCheckButton">期間チェック</button>

    <p id="periodError" class="error"></p>
  </div>

  <div class="block">
    <h2>4. 必須入力チェック</h2>

    <label for="userName">名前:</label>
    <input type="text" id="userName">

    <label for="mailAddress">メール:</label>
    <input type="text" id="mailAddress">

    <button type="button" id="submitButton">送信</button>

    <p id="submitError" class="error"></p>
    <p id="submitResult" class="info"></p>
  </div>

  <script>
    // ============================
    // 画面表示直後の初期処理
    // ============================

    // id="titleMessage" の pタグを取得して文字を書き換える
    document.getElementById('titleMessage').textContent = 'JavaScriptで画面を書き換えました。';

    // ラジオボタン、コンボボックス、メッセージ欄の要素を取得
    const radioButtons = document.querySelectorAll('input[name="category"]');
    const itemSelect = document.getElementById('itemSelect');
    const itemMessage = document.getElementById('itemMessage');

    // ラジオボタンごとのコンボボックス候補データ
    const itemData = {
      fruit: ['りんご', 'みかん', 'バナナ'],
      drink: ['コーヒー', 'お茶', 'ジュース']
    };

    // コンボボックスの中身を作り直す関数
    function updateSelectOptions(category) {
      itemSelect.innerHTML = '';
      const items = itemData[category];

      for (let i = 0; i < items.length; i++) {
        const option = document.createElement('option');
        option.value = items[i];
        option.textContent = items[i];
        itemSelect.appendChild(option);
      }

      updateItemMessage();
    }

    // コンボボックスの選択値に応じてメッセージ変更
    function updateItemMessage() {
      const selectedItem = itemSelect.value;

      if (selectedItem === 'りんご') {
        itemMessage.textContent = 'りんごが選ばれました。赤くて人気の果物です。';
      } else if (selectedItem === 'みかん') {
        itemMessage.textContent = 'みかんが選ばれました。冬によく食べられます。';
      } else if (selectedItem === 'バナナ') {
        itemMessage.textContent = 'バナナが選ばれました。手軽に食べられます。';
      } else if (selectedItem === 'コーヒー') {
        itemMessage.textContent = 'コーヒーが選ばれました。眠気覚ましにもよく飲まれます。';
      } else if (selectedItem === 'お茶') {
        itemMessage.textContent = 'お茶が選ばれました。和食にも合います。';
      } else if (selectedItem === 'ジュース') {
        itemMessage.textContent = 'ジュースが選ばれました。甘い飲み物です。';
      } else {
        itemMessage.textContent = '選択内容に応じてここが変わります。';
      }
    }

    // ラジオボタン変更時の処理
    for (let i = 0; i < radioButtons.length; i++) {
      radioButtons[i].addEventListener('change', function () {
        updateSelectOptions(this.value);
      });
    }

    // コンボボックス変更時の処理
    itemSelect.addEventListener('change', function () {
      updateItemMessage();
    });

    // 初期表示
    updateSelectOptions('fruit');

    // 日付フォーマットチェック
    const dateInput = document.getElementById('dateInput');
    const dateCheckButton = document.getElementById('dateCheckButton');
    const dateError = document.getElementById('dateError');

    function isValidDateFormat(dateStr) {
      const regex = /^\d{4}-\d{2}-\d{2}$/;

      if (!regex.test(dateStr)) {
        return false;
      }

      const date = new Date(dateStr);

      if (isNaN(date.getTime())) {
        return false;
      }

      return true;
    }

    dateCheckButton.addEventListener('click', function () {
      const inputValue = dateInput.value.trim();
      dateError.textContent = '';
      dateError.className = 'error';

      if (inputValue === '') {
        dateError.textContent = '日付を入力してください。';
        return;
      }

      if (!isValidDateFormat(inputValue)) {
        dateError.textContent = '日付の形式が不正です。YYYY-MM-DD で入力してください。';
        return;
      }

      dateError.textContent = '日付形式は正常です。';
      dateError.className = 'info';
    });

    // 期間大小チェック
    const startDate = document.getElementById('startDate');
    const endDate = document.getElementById('endDate');
    const periodCheckButton = document.getElementById('periodCheckButton');
    const periodError = document.getElementById('periodError');

    periodCheckButton.addEventListener('click', function () {
      const startValue = startDate.value.trim();
      const endValue = endDate.value.trim();

      periodError.textContent = '';
      periodError.className = 'error';

      if (!isValidDateFormat(startValue)) {
        periodError.textContent = '開始日の形式が不正です。YYYY-MM-DD で入力してください。';
        return;
      }

      if (!isValidDateFormat(endValue)) {
        periodError.textContent = '終了日の形式が不正です。YYYY-MM-DD で入力してください。';
        return;
      }

      const start = new Date(startValue);
      const end = new Date(endValue);

      if (start > end) {
        periodError.textContent = '期間エラーです。開始日は終了日以前にしてください。';
        return;
      }

      periodError.textContent = '期間は正常です。';
      periodError.className = 'info';
    });

    // 必須入力チェック
    const userName = document.getElementById('userName');
    const mailAddress = document.getElementById('mailAddress');
    const submitButton = document.getElementById('submitButton');
    const submitError = document.getElementById('submitError');
    const submitResult = document.getElementById('submitResult');

    submitButton.addEventListener('click', function () {
      submitError.textContent = '';
      submitResult.textContent = '';

      const errors = [];

      if (userName.value.trim() === '') {
        errors.push('名前は必須です。');
      }

      if (mailAddress.value.trim() === '') {
        errors.push('メールアドレスは必須です。');
      }

      if (errors.length > 0) {
        submitError.innerHTML = errors.join('<br>');
        return;
      }

      submitResult.textContent = '必須チェックOKです。送信可能です。';
    });
  </script>
</body>
</html>
サンプルHTML
JavaScript基本サンプル

JavaScript 基本サンプル

ここを書き換える

1. ラジオボタンでコンボ内容を変更



選択内容に応じてここが変わります。

2. 日付入力チェック

3. 期間の大小チェック

4. 必須入力チェック

サンプルの説明

このサンプルでは、JavaScriptの基本的な使い方を一通り確認できます。

ラジオボタンでコンボボックスの内容を変える

ラジオボタンで「果物」か「飲み物」を選ぶと、その下のコンボボックスの候補が切り替わるようにしています。

ここでは、

  • ラジオボタンの変更を change イベントで受け取る
  • 選択された値に応じて配列データを切り替える
  • for 文で option を作り直す

という流れになっています。

この部分を見て、イベント・配列・繰り返し が組み合わさると画面の動きが作れるのだと分かりました。

コンボボックス選択でメッセージを変える

コンボボックスの選択内容に応じて、その下の説明文を変えています。
ここでは if ~ else if ~ else を使って条件分岐しています。

実際の業務画面でも、「選択された内容によって案内文や入力欄を変える」といった場面は多そうなので、基本として覚えておきたいと思いました。

日付のフォーマットチェック

YYYY-MM-DD の形式で入力されているかを正規表現で確認しています。

const regex = /^\d{4}-\d{2}-\d{2}$/;

このような書き方は最初少し難しく見えましたが、
「4桁-2桁-2桁になっているかを見る」と理解すると少し分かりやすかったです。

期間の大小チェック

開始日と終了日を入力し、開始日の方が後になっていないかをチェックしています。

業務画面でありがちな、

  • 開始日 > 終了日 はエラー
  • 終了日が未入力ならエラー
  • 日付形式が違うならエラー

といった処理の基本形として参考になりそうです。

必須入力チェック

送信ボタンを押した時に、名前とメールアドレスが入力されているかを確認しています。

エラーメッセージを配列にためて最後にまとめて表示する形にしているので、項目が増えても対応しやすそうだと感じました。


次回やりたいこと

今回は JavaScript の本当に基本的な部分だけを勉強しましたが、触ってみると「画面を動かすためにかなり大事な技術だな」と感じました。

次回は、以下のようなことも勉強してみたいです。

  • JavaScript を HTML ファイルから分離して書く方法
  • 関数をもう少し整理して見やすく書く方法
  • チェック処理を共通化する方法
  • テーブルの行追加や削除
  • 業務画面っぽい入力フォームの作成

まずは今回のサンプルを少しずつ書き換えながら、JavaScript の書き方に慣れていきたいと思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次