Array Methods와 Local Storage를 사용하여 expense tracker 구현
-숫자를 입력하면 지출이 +숫자를 입력하면 수입이 자동으로 입력이 되고 Total이 자동으로 바뀐다.
또한 History 탭에서 각 항목에 커서를 올려놓으면 옆에 자동으로 X버튼이 나오고 누르면 해당 항목이 삭제 된다.
HTML audio를 이용한 뮤직 플레이어 구현
플레이, 일시정지, 이전노래, 다음 노래로 이동을 구현. 실행을 하면 해당 노래의 제목과 노래 진행 정도가 바로 표시 된다.
audio태그의 이벤트들로 pause()를 하면 일시정지 play()를 하면 다시 재생이 된다.
또한 ended는 media가 끝이나서 멈췄을때를 말하며, 이 때 다음곡으로 재생하게 해주었다.
const audio = document.querySelector('.audio'),
function pauseSong(){
musicContainer.classList.remove('play');
playBtn.querySelector('i.fas').classList.add('fa-play');
playBtn.querySelector('i.fas').classList.remove('fa-pause');
audio.pause();
}
// Play Song
function playSong(){
musicContainer.classList.add('play');
playBtn.querySelector('i.fas').classList.remove('fa-play');
playBtn.querySelector('i.fas').classList.add('fa-pause');
audio.play();
}
// Song ends
audio.addEventListener('ended', nextSong);
https://developer.mozilla.org/ko/docs/Web/HTML/Element/audio
스크롤을 제일 하단으로 내리면 새로운 포스터들이 표시가 된다.
css와 JS 의 setTimeout을 사용하여 로딩 표시 아이콘을 만들었고, setTimeout을 사용하여 .3초 뒤에 새로운 페이지들이 표시 되도록 하였다.
indexOf와 forEach를 사용하여 포스터 필터 구현
모든 포스트들을 받아와 forEach
를 사용하여 각각의 poste들 모두를 돌고 input의 value인 term
이 있으면 indexOf
가 -1 이상으로 나오므로 -1이상인 포스트들은 모든 flex
로 표시 -1과 같거나 아래인것은 term
이 포함되지 않았다는 것이므로 표시를 하지 않는다.
function filterPosts(e){
const term = e.target.value.toUpperCase();
const posts = document.querySelectorAll('.post');
posts.forEach(post => {
const title = post.querySelector('.post-title').innerText.toUpperCase();
const body = post.querySelector('.post-body').innerText.toUpperCase();
console.log(title.indexOf(term))
if(title.indexOf(term) > -1 || body.indexOf(term) > -1) {
post.style.display = 'flex';
} else {
post.style.display = 'none';
}
})
}
scroll
scrollWidth와 scrollHeight 프로퍼티는 스크롤바에 의해감춰진 영역도 포함한다.
window.addEventListener('scroll', () => {
const {scrollTop, scrollHeight, clientHeight} = document.documentElement;
if(scrollTop + clientHeight >= scrollHeight-5) {
showLoading();
}
})
제시되는 단어들을 제한시간 내에 많이 맞추는 게임
setInterval
을 사용하여 제한시간을 조정하여 0초가 되면 시간초과 메시지가 나오고 Reload 버튼을 누르면 다시 게임을 플레에 할 수 있다.
제일 위에서 난이도를 설정 할 수 있으며 난이도에 따라 단어를 맞췄을시에 추가되는 시간과 점수가 달라진다.
좌측 하단의 셋팅 버튼을 누르면 상단의 난이도 조절 칸을 없앨 수 있다.
setInterval()
delay
마다 함수 혹은 작성한 코드를 반복적으로 실행한다. delay와 ar1... argN은 옵션이다.
delay
: 실행전 대기 시간으로 기본값은 0이고 단위는 millisecond
arg,... argN 함수에 전달할 인수들
clearInterval()
setInterval
의 함수를 중단시킬 때 사용한다.
// func에 전달한 요소 지정 가능
var intervalID = setInterval(func, [delay, arg1, arg2, ...]);
var intervalID = setInterval(function[, delay]);
var intervalID = setInterval(code, [delay]);
const timeInterval = setInterval(updateTime, 1000);
function updateTime(){
time -=1;
timeEl.innerText=time+'s';
if (time == 0){
clearInterval(timeInterval);
// end game
gameOver();
}
}
Source: https://developer.mozilla.org/en-US/docs/Web/API/setInterval
Web Speech API를 활용하여 텍스트를 읽어주는 앱.
SpeechSynthesis
Web Speech API의 인터페이스로 speech service의 컨트롤러 인터페이스이다.
여러 장치에서 voice를 시작, 중지 등 여러 명령어를 사용 할 수 있다.
SpeechSynthesis.speak()
SpeechSynthesis.getVoices()
SpeechSynthesisUtterance
speech request를 대표하는 인터페이스로, 컨텐츠의 언어, 높낮이, 소리등의 정보를 포함하고 있어야한다.
SpeechSynthesisUtterance.text
SpeechSynthesisUtterance.voice
// Init speech synth
const message = new SpeechSynthesisUtterance();
// Store voices
let voices =[];
function getVoices(){
voices = speechSynthesis.getVoices();
voices.forEach(voice =>{
const option = document.createElement('option');
option.value = voice.name;
option.innerText=`${voice.name} ${voice.lang}`;
voicesSelect.appendChild(option);
})
}
// Set text
function setTextMessage(text) {
message.text = text;
}
// Speak text
function speakText(){
speechSynthesis.speak(message);
}
// Set voice
function setVoice(e){
message.voice = voices.find(voice => voice.name === e.target.value);
}
// Voice changed
speechSynthesis.addEventListener('voiceschanged', getVoices);
Source: https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesis