이번에는 setTimeout 과 setInterval 을 알아보자
setTimeout
setTimeout()을 쓰면 n초 후에 코드를 실행시켜 준다
setTimeout(function(){ 실행할코드~ }, 기다릴시간);
위와 같이 사용하면 된다
시간은 ms 단위로 적는다 (1000ms는 1초)
setTimeout(function(){
console.log('안녕')
}, 1000);
위처럼 쓰면 1초 후에 콘솔창에 '안녕'이 뜬다
<div class="alert alert-danger">
5초 이내 구매시 사은품 증정
</div>
<script>
setTimeout(function(){$('.alert').hide()}, 5000)
</script>
이렇게 쓰면 alert 창이 5초 후에 사라지게 된다
따로 추가할 필요 없이 jQuery에서 .hide() 를 사용해서 알림창을 쉽게 사라지게 만들 수 있다 굿!
setInterval
n초'마다' 뭔가를 실행하고 싶으면 setInterval을 사용한다
setInterval(function(){ console.log('안뇽') }, 1000)
위와 같이 작성하면 1초마다 '안뇽'을 띄워준다
setTimeout과 달리 매 초가 흐를때마다 안뇽이 반복적으로 뜨게 된다
참고로 setTimeout 이나 setInterval 의 function(){} 자리에는 별도로 함수를 만들어서 간단하게 넣을 수도 있다
아래 예시를 참고해보자
setInterval(함수, 1000)
function 함수() {
console.log('안녕 난 함수야')
}
이 경우 함수를 넣을 때 () 뒷부분 없이 함수만 넣는 것에 유의해야 한다
++ 참고) 타이머를 삭제하고 싶을 때 clearTimeout() 사용!
문제 : 타이머 만들기
문제
위에서 만든 <div>안에 "5초 이내 구매시 사은품 증정" 이라는 문자가 있습니다.
1초마다 5라는 문자를 1씩 감소시켜봅시다.
0이 되면 <div>를 안보이게 처리합시다.
(힌트) 5라는 문자만 <span>5</span> 이걸로 감싸면 html 조작하기 쉬워집니다.
풀이
- time을 5라고 선언하고, 타이머 함수가 1초마다 실행되는 setInterval 을 만든다
- time은 1씩 줄어든다고 하고, time이 5보다 작으면 span인 .timer의 텍스트에 1씩 줄어드는 글자를 넣는다
-> 텍스트를 찾을 때는 jQuery로 .text() 를 사용하여 innerText 대신 사용하였다 ㅎㅎ
- 만약 time이 0이 된다면 전체 배너인 .alert를 숨긴다
- 아직은 setInterval 옆에 함수를 직접 쓰려니 눈에 잘 들어오지도 않고 헷갈려서 함수를 따로 만든 후 넣었는데, 익숙해지기 위해 바로 옆에 작성해보는 연습도 해야겠다
<div class="alert alert-danger">
<span class="timer">5</span>초 이내 구매시 사은품 증정
</div>
<script>
let time = 5;
setInterval(타이머, 1000);
function 타이머() {
time = time - 1;
if (time < 5) {
$('.timer').text(time);
}
if (time === 0) {
$('.alert').hide();
}
}
</script>
해답
- 0초가 되면 .alert가 사라지는 기능은 구현되어 있지 않다
- 나는 count = count - 1 이렇게 적지 않으면 헷갈려서 일부러 축약형을 안적었는데, 확실히 줄여서 적는 게 깔끔한 것 같다. 나도 줄여서 적는 연습을 해봐야지
- if 문에서 count < 5 가 아니라 count >=0 으로 조건을 설정했다. 그런데 이 경우 (문제에서 요구한 것과 달리) 0이 포함되어 있어 0이 되어도 숫자가 그대로 보이는 점 + 알림창은 사라지지 않음.. 의 문제로 인해 출제된 것과는 다소 차이가 있는 코드로 보인다
- if 문 안에서는 jQuery를 사용하지 않고 일반 자바스크립트 문법을 사용하였다. 어떨 때는 jQuery를 쓰고 어떨 때는 안쓰시는데 사용하는 기준이 뭔지가 좀 궁금하다
<div class="alert alert-danger">
<span id="num">5</span>초 이내 구매시 사은품 증정
</div>
<script>
var count = 5;
setInterval(function(){
count -= 1;
if (count >= 0){
document.querySelector('#num').innerHTML = count;
}
}, 1000);
</script>
해답 본 후 수정해보기
- 별도로 만들지 않고 setInterval 내부에 함수를 직접 작성하였다
- time이 1씩 줄어드는 것을 축약형으로 다시 작성하였다
- 조건문에서 time이 0보다 클 경우와 0일 경우로 나눠 작성하였다
let time = 5;
setInterval(function() {
time -= 1;
if ( time > 0 ) {
$('.timer').text(time);
}
else if ( time == 0 ) {
$('.alert').hide();
}
}, 1000);
'Web > JavaScript' 카테고리의 다른 글
[JS] if else 연습문제 풀이 📖 (1) | 2022.10.19 |
---|---|
[JS] 폼 만들며 배워보는 if else 🧐 (1) | 2022.10.19 |
[JS] 말로만 듣던 jQuery 👀 간단 정리 (1) | 2022.10.05 |
[JS] 서브메뉴를 만들자! classList 🗂 다루기 (2) | 2022.10.04 |
[JS] 이벤트리스너: 들을게 👂 (2) | 2022.10.04 |