개인 프로젝트가 끝난 후 약 3주 동안 자바스크립트 스터디를 진행했다.(22/1/20~2/7)
리액트를 공부하면서 자바스크립트 기본기가 부족하다고 생각했는데, 마침 바닐라 자바스크립트로 진행하는 스터디가 열렸길래 냉큼 신청했다.
자바스크립트로 여러 기능을 구현할 수 있게끔 정리해놓은 사이트를 참고하여
각자 마음에 드는걸 구현하고 내용을 공유하는식으로 진행됐다.
모두 여러개 기능을 구현하셨는데, 나는 첫주 선택한 피아노 만들기가 재밌어서 이것 저것 기능을 붙여보았다. 이런 저런 일이 겹쳐서 시간을 많이 할애하지 못해서 엄청 퀄리티있는 결과물이 나온건 아니지만, 자바스크립트에 대한 이해도를 높일 수 있었다!
Audio
div
안에 넣어줘서 재생이 안되거나 div
가 표시되지 않았음...audio
안에 source
를 넣어줘서 사용source
는 음악파일을 불러오는 역할을 함audio
안에 문장은 브라우저에서 작동 안될 때 나옴.<audio controls>
의 경우 컨트롤러 표시됨<body>
<audio controls>
<source src="/examples/media/sample_audio_ogg.ogg" type="audio/ogg">
<source src="/examples/media/sample_audio_mp3.mp3" type="audio/mpeg">
이 문장은 여러분의 브라우저가 audio 태그를 지원하지 않을 때 화면에 표시됩니다!
</audio>
<!-- 다른 태그들 넣어주기 -->
<body/>
<body>
<!-- 오디오 태그 삽입 -->
<audio id="audioContainer">
<source id='audioSource' src=''/>
Your browser does not support the
<code>audio</code> element.
</audio>
**svg**
svg
안에 path
를 사용하여 영역표시**querySelectorAll**
querySelector
를 사용하면 처음 작성한 것만 검색이 됨.querySelectorAll
을 사용하여 반환 내용을 [NodeList](https://4ngeunlee.tistory.com/188)
로 만듦반환된 값을 가지고 forEach
를 이용해 해당되는 모든 클래스에 addEventListener
를 적용해 클릭 이벤트 적용
const playBtn = document.querySelectorAll(".playBtn");
playBtn.forEach(n => n.addEventListener("click", handleButtonClick));
**unshift**
push
사용시 뒤에 입력됨.lastScales
를 만들기 위해 사용함.pop
을 통해 맨 마지막요소부터 삭제해주었다.
const lastScales = [];
const updateLastScale = btnId => {
if (lastScales.length === 4) {
lastScales.pop();
}
lastScales.unshift(returnScaleName(btnId));
return lastScales;
};
shift()
의 경우 맨 앞에꺼가 삭제됨**textContent**
innerText
가 사용이 안됐음.innerText
보다 성능이 좋다길래 바꿈.const updateScale = btnId => {
nowScale.textContent = returnScaleName(btnId);
};
input태그 사용하기
txt 파일을 string으로 변환하기
텍스트 파일을 이용해 간이 악보를 만들기로 했다.
도 레 미 도 미 도 미 레 미 파 파
와 같은 형태로 쓰여있는 텍스트 파일을 읽어 악보로 변환하고, 음계를 하나씩 표시하고, 악보의 음계와 내가 연주한 음계가 같으면 다음 음계가 표시되도록 해주었다.
**input**
function loadFile() {
let input = document.createElement("input");
input.type = "file";
input.accept = "text/plain";
input.onchange = event => {
processFile(event.target.files[0]);
};
input.click();
}
**FileReader**
function processFile(file) {
let reader = new FileReader();
reader.onload = () => {
preScales = reader.result.split(" ");
score.textContent = reader.result;
output.textContent = preScales[0];
};
reader.readAsText(file, "utf-8");
}
function sliceScale(scale) {
if (lastScales[0] === scale[0]) {
scale.shift();
if (scale.length === 0) {
score.textContent = "";
return "연주 완료";
}
return scale[0];
}
}
display
를 none
으로 주고 열릴 때 flex
로 바꿔주는 형식으로 만들 수 있었다.function displayModal() {
modal.style.display = "flex";
}
function closeModal() {
modal.style.display = "none";
}
function tapCloseModal(e) {
const eventTarget = e.target;
if (eventTarget.classList.contains("modal-overlay")) {
modal.style.display = "none";
}
}
keydown
이라는 이벤트로 컨트롤 할 수 있었다. document.addEventListener("keydown", checkKeyPressed, false);
//숫자 1부터 8까지 키 할당
function checkKeyPressed(e) {
switch (e.keyCode) {
case 49:
handleKeyClick("key-01");
break;
case 50:
handleKeyClick("key-02");
break;
case 51:
handleKeyClick("key-03");
break;
case 52:
handleKeyClick("key-04");
break;
case 53:
handleKeyClick("key-05");
break;
case 54:
handleKeyClick("key-06");
break;
case 55:
handleKeyClick("key-07");
break;
case 56:
handleKeyClick("key-08");
break;
}
}
//악보 로드시 개당 점수를 구해줬다.
function processFile(file) {
let reader = new FileReader();
reader.onload = () => {
performanceScore = 100;
preScales = reader.result.split(" ");
score.textContent = reader.result;
output.textContent = preScales[0];
deductPoints = parseInt(100 / preScales.length);
};
//음계를 처리하는 함수에 틀린 경우를 설정해주었다.
function sliceScale(scale) {
if (lastScales[0] === scale[0]) {
scale.shift();
if (scale.length === 0) {
score.textContent = "";
return `연주 완료 ${performanceScore}점`;
}
} else {
if (performanceScore < 0) {
performanceScore = 0;
}
performanceScore = performanceScore - deductPoints;
}
return scale[0];
}
3주동안 진행하긴했지만, 긴 시간을 할애하지는 못하고 짬나는대로 틈틈히 진행해서 완성도가 떨어져서 아쉽다. 그렇지만 자바스크립트에 대해 많이 공부할 수 있었고, 프로젝트 때 안써본 오디오 태그, 인풋 태그 등 을 써봐서 재밌었다.