自分がやってよかったweb製作でのJavaScriptの勉強方法

# はじめに
現在web制作の勉強として、```jQuery```の勉強をしているのですが、```jQuery```の学習が楽に感じた```JavaScript```の勉強法を紹介します！

# JavaScriptの勉強方法
web制作のための勉強なので、```DOM操作```と```イベント処理```についてのみの勉強方法ですが、他にも応用可能だと思っています。
以下の手順で進めました。
+ JavaScriptの基本文法
+ DOM操作のメソッドの確認
+ DOM操作、イベント処理のコードの書き方
+ 演習を通して、コードを書く

## JavaScriptの基本文法
まずは```JavaScript```の基本文法からやっていきます。
### 1.変数の宣言
```javascript:javascript
let name = "太郎";
const age = 20;
```
+ ```let```は値を後で変更できる変数
+ ```const```は値を後で変更できない変数

```javascript```は```python```とは異なり、文末に```;```が必要です。
### 2.データの種類(データ型)
```javascript:javascript
let text = "こんにちは";//文字列
let number = 10;       //数値
let flag = true;       //真偽値
```
データ型は自ら定義しなくても自動的に設定してくれます。
### 3.条件分岐(if文)
```javascript:javascript
let score = 80;

if (score >= 70) {
  console.log("合格です！");
} else {
  console.log("残念、不合格です。");
}
```
### 4.繰り返し処理(for文)
```javascript:javascript
for (let i = 0; i < 5; i++) {
  console.log("こんにちは！");
}
```
上記の例では、「こんにちは！」が5回表示されます。条件式の中で、変数を定義することもできます。
### 5.関数(function)
関数はweb制作においてとても重要なので、しっかり理解しておきましょう。
```javascript:javascript
function sayHello() {
  console.log("こんにちは！");
}

sayHello();  // 関数を呼び出す
```
特定の処理をまとめておくことで、何度も同じ記述をする手間を省くことができます。

だいたいこの辺りを理解しておくだけで十分です。全然コード書けないよって状態でも、この後に演習を行っていく中で、徐々にかけるようになっていきます！！
## DOM操作のメソッド確認
ここでは、```DOM操作```と呼ばれる```javascript```で行えるブラウザに表示されているHTMLの要素操作についてのメソッドにどんなものがあるかを確認します。
よく使う```DOM操作```メソッドを以下にまとめました！
### 1.```document.getElementById()```
```html```のID要素を所得します。
```javascript:javascript
const title = document.getElementById("main-title");
```
```html:html
<h1 id="main-title">こんにちは！</h1>
```
### 2.```document.querySelector()```
```CSS```のセレクタで要素を1つ取得します。
```javascript:javascript
const item = document.querySelector(".menu-item");
```
```#id名```や```.クラス名```など()内は```CSS```と同じ書き方で記述します。
### 3.```document.querySelectorAll()```
複数の要素をまとめて取得することができます。
```javascript:javascript
const items = document.querySelectorAll(".menu-item");

items.forEach(function(item) {
  console.log(item.textContent);
});
```
### 4.```.textContent```
要素の中の文字を読み取ったり、変更できます。
```javascript:javascript
title.textContent = "新しいタイトルです";
```
### 5.```.innerHTML```
HTMLの中身ごと書き換えたいときに使います。```.textContent```と異なる点は、```html```のタグごと書き換えられる点です。
```javascript:javascript
const box = document.getElementById("box");
box.innerHTML = "<p>新しい内容</p>";
```
### 6.```.classList.add()```/```.remove()```/```.toggle()```
```CSS```にクラスを追加・削除することができます。
```javascript:javascript
box.classList.add("active");
box.classList.remove("active");
box.classList.toggle("active"); // ON/OFF切り替え
```
### 7.```.setAttribute()```/```.getAttribute()```
属性(id,src,hrefなど)を操作できます。
```javascript:javascript
const link = document.querySelector("a");
link.setAttribute("href", "https://example.com");

const url = link.getAttribute("href");
```
### 8.```.style```
直接```CSS```を指定することができます。
```javascript:javascript
box.style.backgroundColor = "red";
box.style.fontSize = "20px";
```

まずはこの辺を覚えておけば大丈夫です！！

## DOM操作、イベント処理のコードの書き方
確認したメソッドを使って、どのようにDOM操作を実現するか見ていきます！
イベント処理(ユーザー操作が行われたら処理を実行する)を使っていきます。
よく使うイベントには以下のようなものがあります。
### イベントの種類
+ ```click``` : クリックされたとき
+ ```input``` : 入力されたとき(文字入力など)
+ ```change``` : 値が変わったとき(セレクトボックスなど)
+ ```submit``` : フォームが送信されたとき
+ ```mouseover``` : マウスが上に乗ったとき
+ ```keydown``` : キーボードが押されたとき

## イベントの書き方(基本形)
```javascript:javascript
const button = document.getElementById("myBtn");

button.addEventListener("click", function() {
  alert("ボタンがクリックされました！");
});
```
+ ```addEventListener()``` : イベントを登録する命令
+ ```"click"``` : クリックされたとき
+ ```function(){...}``` : 実行する処理
この```function(){...}```の中に```DOM操作のメソッド```を記述することで、動的なWebページを作成できます！！

### イベント処理の例
#### 1.テキストを変更する
```javascript:javascript
const btn = document.getElementById("btn");
const title = document.getElementById("title");

btn.addEventListener("click", function() {
  title.textContent = "クリックされました！";
});
```
```html```の```id="btn"```を取得し、それがクリックされたら、```id="title"```のテキストが「クリックされました！」に変更されます。

#### 2.クラスをつけて見た目を変える
```javascript:javascript
const menu = document.getElementById("menu");

menu.addEventListener("mouseover", function() {
  menu.classList.add("hovered");
});
```
```id="menu"```の要素の上にマウスカーソルを持ってきたとき、```id="menu"```要素に```class="hovered"```を追加します。これは```css```の```:hover```を```javascript```で表したものです。

#### 3.入力内容をリアルタイムで表示する
```html:html
<input id="name" value=name>
<div id="preview"></div>
```
```javascript:javascript
const input = document.getElementById("name");
const preview = document.getElementById("preview");

input.addEventListener("input", function() {
  preview.textContent = input.value;
});
```
```html```の```input```要素に文字入力されたら、入力された文字を```id="preview"```要素に出力するものです。イベントが```input```なので、入力されたときに実行されます。

ここまでで、```javascript```の基礎とDOM操作、イベント処理の基本的なものを学習しました。
この後はひたすら演習を解いていきます！！

## 演習を通して、コードを書く
ここから演習に入っていきます！
でも、演習ってなにをやるの？そこで```ChatGPT```を使っていきます！
```ChatGPT```に演習問題と答えを作成してもらうことで、だれでも無料で大量の演習を行うことができます。
試しに「JavascriptでDOM操作とイベント処理の演習問題をだして。HTMLとCSSは作成して、Javascriptだけ記述するようにして。答えは出力しないで。」というプロンプトを送ってみましょう。
そうすると以下のように演習を作ってくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830132/19072960-216d-4ae4-ae0c-d824c0e3d793.png)
見切れてしまっているが、以下のように仕様、```html```、```css```も作成してくれています。
### 仕様
+ 入力欄に文字を入力し、「追加」ボタンを押すと、リストに新しいタスクが表示される
+ 各タスクの横に「削除」ボタンがあり、それを押すとそのタスクが削除される

```html:html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>タスク管理</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <div class="container">
    <h1>タスク管理</h1>
    <input type="text" id="taskInput" placeholder="タスクを入力">
    <button id="addBtn">追加</button>
    <ul id="taskList"></ul>
  </div>
  <script src="script.js"></script>
</body>
</html>
```
```css:css
body {
  font-family: sans-serif;
  background-color: #f0f0f0;
  padding: 30px;
}

.container {
  background: white;
  padding: 20px;
  max-width: 500px;
  margin: 0 auto;
  border-radius: 10px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}

input[type="text"] {
  width: 70%;
  padding: 10px;
  margin-right: 10px;
}

button {
  padding: 10px 15px;
  cursor: pointer;
}

ul {
  list-style: none;
  padding: 0;
}

li {
  margin-top: 10px;
  padding: 10px;
  background: #e3e3e3;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
```
このように出力してもらった演習を解いていきます。
自分で解いたら、```ChatGPT```に答えの出力をお願いしましょう！
```ChatGPT```に「答えをみせて」と送ったところ、以下のようなコードが返ってきました。
```javascript:javascript
// 要素を取得
const addBtn = document.getElementById('addBtn');
const taskInput = document.getElementById('taskInput');
const taskList = document.getElementById('taskList');

// 「追加」ボタンのクリックイベント
addBtn.addEventListener('click', function () {
  const taskText = taskInput.value.trim();

  if (taskText === '') return; // 空欄は追加しない

  // li要素を作成
  const li = document.createElement('li');
  li.textContent = taskText;

  // 削除ボタンを作成
  const deleteBtn = document.createElement('button');
  deleteBtn.textContent = '削除';
  deleteBtn.style.marginLeft = '10px';

  // 削除ボタンのイベント
  deleteBtn.addEventListener('click', function () {
    taskList.removeChild(li);
  });

  // liに削除ボタンを追加
  li.appendChild(deleteBtn);

  // ulにliを追加
  taskList.appendChild(li);

  // 入力欄を空に
  taskInput.value = '';
});
```
このようにして、1人で演習を何回も行うことができます！
この方法はどのプログラム言語でもできるので、アウトプットの場として、活用してみてください！！