[JavaScript] 영화관 좌석 예매
포스트
취소

[JavaScript] 영화관 좌석 예매

작성중 (HTML/ JavaScript 포함/ CSS 미포함)

Code

1
2
3
4
5
6
7
8
9
10
11
12
<!-- 영화 선택 창 HTML -->
<div class="movieContainer">
  <label for="movie">
  Pick a Movie :
  </label>
  <select name="pickMovie" id="movie">
  <option class="price" value="10">Avengers:Endgame ($10)</option>
  <option class="price" value="12">Joker ($12)</option>
  <option class="price" value="8">Toy Story 4 ($8)</option>
  <option class="price" value="9">The Lion King ($9)</option>
  </select>
</div>

Pick Movie
1.label 옵션을 통해 id가 movie인 select tag에 label 부여
2.select tag의 value 값을 가격 값으로 이용

1
2
3
4
5
6
7
8
9
10
//DOMContentLoaded 이벤트를 통해 HTML 문서를 불러온 후 JS 적용
document.addEventListener('DOMContentLoaded', ()=>{
  //클래스 선택자를 이용해 각 클래스 별 변수 지정
  const seatContainer = document.querySelector('.seatContainer');
  const movie = document.getElementById('movie'); // 선택할 영화
  let moviePrice = Number(movie.value); // 영화가격
  let count = document.querySelector('#count'); // 인원수
  let costs = document.querySelector('#costs'); // 총 예매 가격 확인 변수
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<ul class="showcase">
  <li>
  <div class="availableSeat"></div>
  <small class="small">Available Seat</small>
  </li>
  <li>
  <div class="selectedSeatIcon"></div>
  <small class="small">Selected Seat</small>
  </li>
  <li>
  <div class="occupiedSeat"></div>
  <small class="small">Occupied Seat</small>
  </li>
</ul>

showcase
좌석별 확인 용 아이콘 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<div class="seatContainer" style="margin-left:100px;">
  <div class="screen"></div>
  <div class="row">
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
  </div>

  <div class="row">
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="occupiedSeat"></span>
      <span class="occupiedSeat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
  </div>

  <div class="row">
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="occupiedSeat"></span>
      <span class="seat"></span>
  </div>

  <div class="row">
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="occupiedSeat"></span>
      <span class="occupiedSeat"></span>
  </div>

  <div class="row">
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
  </div>

  <div class="row">
      <span class="seat"></span>
      <span class="occupiedSeat"></span>
      <span class="occupiedSeat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="seat"></span>
      <span class="occupiedSeat"></span>
      <span class="seat"></span>
  </div>
</div>
<p style="margin-left:35px; margin-top:-5px;" class="text">
  You have selected<span id="count">0</span> seats for a price of $ <span id="costs">0</span>
</p>

div row 를 이용해 같은 한 줄에 좌석 클래스 배치

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//좌석 클릭 이벤트를 통해 클래스 이름 변경 하기

seatContainer.addEventListener('click', (e) => {        //seatContainer 클릭시 이벤트 발생

    if(e.target.className === 'seat'){                  //seat --> selectedSeat 클래스로 변경         
        e.target.className = 'selectedSeat';           
    } else if(e.target.className === 'selectedSeat'){   //selectedSeat --> seat 클래스로 변경
        e.target.className = 'seat';
    }

    countSeatPrice();                                   //총 가격 계산 기능 실행;
})

//가격 계산 기능 추가
function countSeatPrice(){
  const selectedSeatCount = document.querySelectorAll('.selctedSeat').length; //선택된 좌석들에 대한 변수 
  count.textContent = selectedSeatCount;                                      // span id ="count" 에 selected countSeatPrice 값 추가
  costs.textContent = selectedSeatCount * moviePrice;                         // span id ="costs" 에 총 가격 값 추가
}
1
2
3
<div class="moviePic" style="width: 111px; height:200px; display:inline-block; margin-left:30px; margin-right: 100px; margin-top:105px;">
  <img id="myImg" src="img/ban_1.jpg" style="width:300px; border-radius: 7px; height:400px; float:left;">
</div>

선택 변경시 이미지 변경을 위한 div 태그 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//선택한 영화 이미지 변경 function
function changMoviePicture(){
    let index = movie.selectedIndex;  //select한 index값 변수 지정
    var myImg = document.getElementById("myImg"); 
    myImg.setAttribute("src","img/ban_" + index + ".jpg"); //그림 이름_ + index값 으로 그림 불러오기
}

//영화 변경시 이벤트 발생 
movie.addEventListener('change', (e) => {

    changMoviePicture() // 이미지 변경 function 실행
    moviePrice = Number(e.target.value); // option 값의 value를 이용하여 가격 변수 설정
    countSeatPrice()   // 가격 계산 function 실행
})
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.