-
6. To do list 만들기Javascript 2022. 1. 12. 15:37
1. html과 css 작성
<div id="maindiv"> <h1>To do List</h1> <form action="get" id="inputForm" autocomplete="off"> <input type="text" id="inputText"> <input type="submit" id="inputSubmit"> </form> <ul id="listUl"> </ul> </div>
form으로 감싼 텍스트input과 submit버튼을 만들어 주고
그 아래에는 submit으로 넘긴 내용을 담을 ul을 만들어 주면 html설정은 끝난다.
그리고 css 설정을 해주면 아래와 같은 큰 틀이 완성된다.
이제 입력하는 값을 아래에 리스트 형태로 추가할 수 있도록 자바스크립트를 이용해 설정해주면 된다.
2. javascript
투두리스트를 만들 때 필요한 기능을 크게 나누자면 다음과 같다.
1. 인풋에 입력한 텍스트를 아래에 목록으로 화면에 띄워주는 기능
2. 텍스트 목록을 변경할 수 있도록 해주는 기능
3. 텍스트 목록을 삭제할 수 있도록 해주는 기능
각각을 함수에 담아 실행했다.
2-0. 기본설정
document.addEventListener('DOMContentLoaded', init); //head에서 불러온 js파일 정상작동하도록 function init() { // querySelector로 필요한 html요소 가져오기 const submitElement = document.querySelector('#inputSubmit'); const formElement = document.querySelector('#inputForm'); const inputElement = document.querySelector('#inputText'); const ulElement = document.querySelector('#listUl'); // createElement로 입력한 텍스트를 담을 html요소 새로 만들기 const liElement = document.createElement('li'); const spanElement = document.createElement('span'); const span2Element = document.createElement('span'); // 수정에 필요한 flag 만들어 두기 (default : true) let updateFlag = 1; // form엘리먼트에 submit시 이벤트 추가하기 formElement.addEventListener('submit', submitHandler);
자바스크립트 조작 시 필요한 엘리먼트들을 모두 객체에 담았다.
그리고 form을 submit시 일어날 이벤트를 추가했다.
❗️아래의 2-1부터 2-3까지의 콜백함수는 모두 init() 내에 작성해야한다.
2-1. submit 이벤트 콜백함수
function submitHandler(e) { //submit 시 페이지 이동하는 default 제거 e.preventDefault(); //인풋으로 입력한 텍스트를 html요소 안에 담기 spanElement.innerHTML = inputElement.value; inputElement.value = ""; // 담은 뒤 인풋박스 초기화 span2Element.innerHTML = "X"; span2Element.setAttribute("class", "deleteIcon") //HTML 정렬하기 liElement.append(spanElement); liElement.append(span2Element); ulElement.append(liElement); /* <ul> <li> //liElement <span></span> //spanElement <span></span> //span2Element </li> </ul> */ //수정 이벤트 추가 spanElement.addEventListener('click', updateHandler) //삭제 이벤트 추가 span2Element.addEventListener('click', removeHandler) }
form태그를 submit 하게 되면 자동으로 페이지가 새로고침 된다. 이를 방지하기 위해 preventDefault를 해주고
인풋에 입력한 텍스트(value)를 innerHTML을 이용해 엘리먼트에 담는다.
append를 이용해 기존 html요소에 삽입해주면 <ul>엘리먼트의 아래에 <li>엘리먼트가 생성되며 화면에 나타나게 된다.
submit 시에 생성되는 span, span2 엘리먼트에 각각 수정과 삭제 이벤트를 추가해준다.
2-2. update 이벤트 콜백함수 🔥
수정 시에는 크게 두가지로 나눠진다.
1) 기존의 span엘리먼트 안에 input엘리먼트를 만들고 값을 새로 입력할 수 있게하는 동작 (updateHandler)
2) 새로 입력 후 엔터를 했을 때 인풋박스가 사라지고 기존의 span에 새 텍스트를 담는 동작 (keypressHandler)
function updateHandler(e) { //input을 클릭하면 계속 updateHandler가 발동되는 문제 //이를 해결하기 위해 최초 클릭 이후 flag를 false로 만들어준다. if (updateFlag) { updateFlag = false } else { return } //content라는 저장공간을 만들어 기존의 내용을 저장해둔 뒤 화면에서 지운다. let content = e.target.innerHTML //메모리에 기존의 내용 저장공간 만들고 저장 e.target.innerHTML = '' //내용 지우기 //새로운 input엘리먼트를 생성해 span의 하위에 추가한다. const inputElement = document.createElement('input') inputElement.value = content; //input의 초기값은 기존의 텍스트 inputElement.setAttribute('class', 'newinput'); e.target.append(inputElement) //키보드로 수정 시 발동되는 이벤트 inputElement.addEventListener('keypress', keypressHandler) } function keypressHandler(e) { console.log(e.keyCode) // 누른 키 값을 알 수 있음. enter = 13 if (e.keyCode !== 13) { return } //엔터를 누르면 함수 끝냄 const content = e.target.value; //content에 새로 입력한 텍스트를 담음 let node = e.target.parentNode; //input의 부모요소 = span node.innerHTML = content; //span에 기존의 값(input엘리먼트) 대신 content를 담음 updateFlag = true; //다시 수정이 가능하도록 flag를 true로 변경해준다. }
2-3. delete 이벤트 콜백함수
function removeHandler(e) { e.target.parentNode.remove(); }
submitHandler() 내에서 설정한 removeHandler의 타겟은 li 하위의 span2이므로 그 상위항목(parentNode)인 li를 삭제해야 모든 내용이 사라진다.
'Javascript' 카테고리의 다른 글
자동차경주 예제로 Promise 객체의 개념 이해해보기 (0) 2022.01.29 5. javascript - 객체의 복사 (0) 2022.01.10 4. javascript - html DOM 조작 (0) 2022.01.10 3. javascript 기초 - forEach, 배열중복제거 (0) 2022.01.06 2. javascript 기초 - array와 object (0) 2022.01.04