-
[JavaScript/VanillaJS] ์กฐ์ฉํ ์๋(silence alarm) ์น ์ฑ ๋ง๋ค๊ธฐ - 5javascript 2019. 4. 27. 19:03
์๋ ํ์ธ์, Jerry์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๋์ 5ํธ๊น์ง ์์ด์. ์ด์ ๋ง๋ฌด๋ฆฌ๋ฅผ ํด์ผ ํ๋ ์ ํธ ์๊ฐ๋ฅผ ์ ์ฑ ๋ค์ฌ ์ด์๊ฒ ํด ๋ณผ๊น ํฉ๋๋ค :D
[#1] querySelector( )์ ๋ฐฑํฑ( ` )์ ์๊ฐํฉ๋๋ค.
โถ https://bejerry.tistory.com/15
[#2] setInterval( )๊ณผ ES6 ๋ง๋ณด๊ธฐ!
โถ https://bejerry.tistory.com/16
[#3] typeof( )์ ๋ธ๋ก์ค์ฝํ!
โถ https://bejerry.tistory.com/17
[#4] classList ๊ฐ์ฒด์ css ์ ๋๋ฉ์ด์ :)
โถ https://bejerry.tistory.com/18
์, ์ ์๊ฐ์ ์ถ๊ฐํ๋ CSS, ๊ธฐ์ต๋์๋์? ์ถ๊ฐํ ๋ถ๋ถ์ ๊ธฐ์กด alarm.css์์ ๊ฑท์ด๋ด๊ณ , ์๋ก์ด popup.css ํ์ผ๋ก ๋ง๋ค ๊ฒ๋๋ค.
์ ์ฐฝ์ ๋์ฐ๊ธฐ๋ก ํ์์ฃ ? ๋์์ง ์ ์ฐฝ์ HTML ํ์ผ(popup.html)๊ณผ CSS(popup.css)๋ก ๋ฏธ๋ฆฌ ์์ ์ ํด๋๋ ค๊ณ ํฉ๋๋ค.
4ํธ์์ ์์ฑํ๋ css์๋ ๋ด์ฉ์ด ์กฐ๊ธ ๋ฌ๋ฆฌ์ง๋ ๊ธ์ ๊ผผ๊ผผํ ์ฝ์ด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
(ํผ๋์ด ์ค์ จ๋ค๋ฉด ์ฃ์กํฉ๋๋ค. ๋ถ๋ช ์ด ํฌ์คํ ์ ๋ค ๋ณด๊ณ ๋์ ํ์ ์ดํดํ์ค ๊ฒ๋๋ค!)
popup.css
body { width: 100%; height: 100%; } .alarmOn { position: absolute; width: 100%; height: 100%; top: 0; left: 0; animation: blink 1s step-end infinite; } /* for Chrome, Safari */ @-webkit-keyframes blink { 0% {background-color: red;} 50% {background-color: white;} }
4ํธ์ alarm.css์ ์ฝ๋๋์ ์กฐ๊ธ ๋ค๋ฅด์ฃ ? ๊ทธ ์ด์ ๋ popup.html์ body ์์๋ div๊ฐ ํ๋๋ฐ์ ์์ด์ ๊ทธ๋ ์ต๋๋ค. ๊ทธ๋์ 4ํธ์ ์์ค์ ์กฐ๊ธ ๋ค๋ฅผ ๊ฑฐ์์. ๊ทธ๋ผ popup.html ์์ค๋ฅผ ํ ๋ฒ ๋ณด์ค๊น์? ์๋์ ์์ต๋๋ค.
popup.html
<html> <head> <meta charset='utf-8'> <title>POPUP</title> <link rel='stylesheet' href='popup.css'> </head> <body> <div class='alarmOn'></div> </body> </html>
4ํธ๊ณผ๋ ๋ค๋ฅด๊ฒ popup.html์์ alarmOn์ ์์ ๊ณ ์ ์์ผ๋์ต๋๋ค. ์๋? 4ํธ์์ ํ ํ์ด์ง(html)์์ ์๊ฐ์ด ๊ฐ์ผ๋ฉด ๊น๋นก์ด๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๊น๋นก์ด์ง ์๊ฒ ํ์์ฃ ? 5ํธ์ด 4ํธ๊ณผ ๋ค๋ฅธ ๋ถ๋ถ์ ์ด๊ฒ์ ๋๋ค!
์ด ํ์ ์ฐฝ์ด ๋์จ๋ค๋ ๊ฒ ์์ฒด๊ฐ ์๊ฐ์ด ๊ฐ์ ๋ ๋์ค๋๊ฑฐ์ฃ . (๋ฐฐ๊ฒฝ์์ด ๊น๋นก์ด๋)ํ์ ์ฐฝ์ด ํ์ฌ ์๊ฐ๊ณผ ์ค์ ์๊ฐ์ด ๊ฐ์ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค๊ฐ ๊ฐ์์ง๋ฉด (๊น๋นก์ด๊ณ ์๋)ํ์ ์ฐฝ์ด ์ง์~ ๋ํ๋๋ ๊ฑฐ์ฃ !
popup.html์ alarm.js๋ฅผ import(?)ํ์ง ์์ต๋๋ค. popup.html์ js์์ด ๊น๋นก์ด๋ css๋ง ๋ค๊ณ ์๋ html ํ์ผ์ด๋๊น์!
window.open( ), clearInterval( )
if(current === setValue){ window.open('popup.html'); clearInterval(alarm); //alarmContainer.classList.add('alarmOn'); } /* else { alarmContainer.classList.remove('alarmOn'); } */
if( ) ๋ฌธ์ ์กฐ๊ฑด์ด true๋ผ๋ฉด if๊ตฌ๋ฌธ์ ์คํํ๊ณ , else๋ ์ฃผ์ ์ฒ๋ฆฌํ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ classList๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. classList๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ alarmOn์ด๋ผ๋ class๋ช ์ ์ถ๊ฐํ๊ธฐ ์ํจ์ด์์ด์. ๊ณ ์ ์ ํด๋ ์ง๊ธ ์ํฉ์ด๋ผ๋ฉด classList๋ฅผ ๋นผ์ผํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ถ๊ฐ๋ ๊ฒ์? window.open( )๊ณผ clearInterval( )์ ๋๋ค.
setInterval( )์ ์ฐ๋ฉด (ํ์์ ๋ฐ๋ผ) ๋ฐ๋ณต์ ๋๋ผ ๋์ clearInterval( )์ ์จ์ผ ํ๋ ์ ์ ๋ฐฐ์ ์์ต๋๋ค. ์ด๋์์?
setInterval( )๊ณผ clearInterval( ), ๋ฐ๋ก 2ํธ(https://bejerry.tistory.com/16)์ด์ฃ ! setInterval( )์ ๋ณ์(interval_id)์ ๋ด๊ณ clearInterval(interval_id) ํ๋ผ๋ฏธํฐ์ ๊ทธ ๋ณ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
MDN์์ ์ค๋ช ํ๋ clearInterval์ ๋๋ค. ์ฐธ๊ณ ์๋ฃ : https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/clearInterval
์์ ์์ค๋ฅผ ๋ณด์ธ์. interval_id ์๋ฆฌ์ alarm์ด๋ผ๋ ๋ณ์๊ฐ ๋ค์ด๊ฐ ์์ฃ ? setInterval( ) ๋ฉ์๋๋ฅผ ๋ณ์์ ๋ด๊ณ ๊ทธ ๋ณ์๋ฅผ clearInterval( ) ์ธ์ ์๋ฆฌ์ ๋ฃ์ด์ค์ผ ํฉ๋๋ค. ์์ธํ ์ต์ ์ ์์ ์ฐธ๊ณ ์๋ฃ๋ก ์์ฑํด๋ MDN ๋งํฌ๋ก ์ ์ํ์ฌ example์ ํ์ธํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
๊ทธ๋ผ ์ง๊ธ๊น์ง์ ์ ์ฒด ์์ค๋ฅผ ํ ๋ฒ ๋ณด๊ณ , ๋ง์ง๋ง์ ์์์ผ๋ก ๋ง๋ฌด๋ฆฌํ๊ฒ ์ต๋๋ค.
(popup.html, popup.css๋ ์์ ์์ค๊ฐ ์์ผ๋ฏ๋ก ๋ค์ ์ฌ๋ฆฌ์ง ์๊ฒ ์ต๋๋ค.)
์ ์ฒด ์์ค๋ฅผ ํ ๋ฒ ๋ณด์ค๊น์?
alarm.html
<html> <head> <meta charset='utf-8'> <title>ALARM</title> <link rel='stylesheet' href='alarm.css'> </head> <body> <div class='container'> <div class='js-alarm nav'> <h1>00:00:00</h1> <input type='time' min='00:00' max='23:59'/> </div> </div> <script src='alarm.js'></script> </body> </html>
alarm.css
body { width: 100%; height: 100%; } .container { position: absolute; z-index: 1; width: 100%; height: 100%; top: 0; left: 0; display: table; } .nav { display: table-cell; vertical-align: middle; width: 100%; height: 100%; } .js-alarm{ width: 100%; height: 100%; text-align: center; }
alarm.js
const alarmContainer = document.querySelector('.js-alarm'); const currentTime = alarmContainer.querySelector('h1'); const setTime = alarmContainer.querySelector('input'); function getAlarm(){ const setValue = setTime.value; const date = new Date(); const hours = date.getHours(); const minutes = date.getMinutes(); const current = `${hours < 10 ? `0${hours}` : hours}:${minutes < 10 ? `0${minutes}` : minutes}`; if(current === setValue){ window.open('popup.html'); clearInterval(alarm); } } function getTime(){ const date = new Date(); const hours = date.getHours(); const minutes = date.getMinutes(); const seconds = date.getSeconds(); currentTime.innerText = `${hours < 10 ? `0${hours}` : hours}:${minutes < 10 ? `0${minutes}` : minutes}:${seconds < 10 ? `0${seconds}` : seconds}`; } function init(){ getTime(); setInterval(getTime, 1000); alarm = setInterval(getAlarm, 1000); } init();
๋ค์ ์์ค๋ฅผ ์ฒ์ฒํ ๋ณด์ธ์. ์ฐ๋ฆฌ๊ฐ ๋ฌด์์ ๋ฐฐ์ ๋์ง ์ ์ ์์ต๋๋ค.
- setInterval( )
- clearInterval( )
- Date ๊ฐ์ฒด๋ก ์๊ฐ ๊ฐ์ ธ์ค๊ธฐ
์ด ์ธ์๋ ๋ฐฑ ํฑ( ` ) ๋ฑ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ฃ . ์์ค๋ฅผ ์ฌ๋ฌ๋ฒ ๋ณด์๋ฉด ์์ง ์์ผ์ค๊ฑฐ์์!
๋ฐฐ์ด ๊ฒ๋ค์ ์ด์ฉํด์ ๋ฌด์ธ๊ฐ๋ฅผ ์ง์ ๋ง๋ค์ด๋ณด๋ ๊ฒ๋ ์์ฒญ ์ข์ ๊ณต๋ถํจ๊ณผ ์ค ํ๋์ฃ .
๊ทธ๋ผ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๊ฒ ์ด๋ป๊ฒ ๋์ํ๋์ง ์์์ผ๋ก๋ ๋ณด๊ณ ๊ฐ์ค๊ฒ์~
์์์ ๋ณด์๋ค๋ณด๋ฉด ์๋์๋ฆฌ๊ฐ ๋๋๋ฐ ๊ทธ๊ฑด ์์ํธ์งํ ๋์ ์ถ๊ฐ๋ก ๋ฃ์ ํจ๊ณผ ์ฌ์ด๋์ด๊ธฐ ๋๋ฌธ์ ์น ์ฑ์ด๋์ ๋ฌด๊ดํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์กฐ์ฉํ ๋์คํ๋ ์ด ์๋๋ง ๋ง๋ค์์ฃ . ํ์ฌ์์ ๋์ ํด๊ทผ์ ์๋ ค์ฃผ๋ silence alarm ์ ์์ ํด๋ณด์์ต๋๋ค.
์ด๋ ์ จ๋์? ํน์ ๊ถ๊ธํ์ ์ ์์ผ์๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์๊ณ , ๊ฐ์์ ๋ถ์กฑํ๋ ์ ํน์ ํ์ํ๋ ๊ฒ๋ค ์๋ ค์ฃผ์๋ฉด ๋ค๋ฅธ ํฌ์คํ ์์ ๊ผญ ์ฐธ๊ณ ํ์ฌ ๊ธ ์ฐ๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค :)
'javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ