๊ฐœ๋ฐœ ๐Ÿพ/JavaScript

TODOLIST ๋งŒ๋“ค๊ธฐ step by step - Vanilla JavaScript

JOTOKKI 2022. 3. 11. 20:15
728x90

๋ณธ ํฌ์ŠคํŒ…์€ javascript์— ์ž…๋ฌธํ•˜๊ณ ์ž ํ•˜๋ ค๊ณ  ํ• ๋•Œ ๊ฐ€๋ณ๊ฒŒ ํ•™์Šต ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚˜๋ฆ„์˜ ์ปค๋ฆฌํ˜๋Ÿผ์„ ์งœ๋ณธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

todo-list ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค๋ฅธ ๊ฒŒ์‹œ๊ธ€์ด๋‚˜ ์œ ํˆฌ๋ธŒ์—๋„ ๋งŽ์ด ๋‚˜์™€์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ์ดˆ๋ณด์ž๊ฐ€ ์ข€ ๋” ์ ‘๊ทผํ•˜๊ธฐ ์‰ฝ๋„๋ก ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰ ๊ณผ์ •์„ ์ชผ๊ฐœ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

์ˆœ์„œ

1. ๊ธ€ ์ถ”๊ฐ€ํ•˜๊ธฐ

2. ๊ธ€ ์‚ญ์ œํ•˜๊ธฐ

3. ๊ธ€ ์ˆ˜์ •ํ•˜๊ธฐ

4. localStorage์— ์ €์žฅํ•˜๊ธฐ

 

* html๊ณผ css๋Š” ๋Œ€์ถฉ ๋งŒ๋“ค์–ด ๋†“์•˜์Šต๋‹ˆ๋‹ค. (์ •๋ง ๋Œ€์ถฉ ใ…Ž..) 

์ด ์†Œ์Šค๋ฅผ ๋‹ค์šด๋ฐ›์•„ ์‹œ์ž‘ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

1-initial.zip
0.00MB

 

๊ธฐ๋Šฅ ๋ชฉ๋ก์„ ์ฐธ์กฐํ•˜์—ฌ ๋ฏธ๋ฆฌ ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณธ ๋’ค, ์™„์„ฑ๋œ ์†Œ์Šค์™€ ๋น„๊ตํ•ด ๋ณด์„ธ์š”!

 


1. ๊ธ€ ์ถ”๊ฐ€ํ•˜๊ธฐ

 

๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก

 - input ์ž…๋ ฅ ํ›„ "ADD" ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ํ•˜๋‹จ์— ์ถ”๊ฐ€
 - input ์ด ๋นˆ๊ฐ’์ธ ๊ฒฝ์šฐ "ADD" ๋ฒ„ํŠผ ํด๋ฆญ์‹œ "๊ฐ’์„ ์ž…๋ ฅํ•˜์„ธ์š”!" alert์„ ๋„์šด ํ›„ input์œผ๋กœ focus
 - ๋ชฉ๋ก์— ์•„๋ฌด๊ฒƒ๋„ ์—†์„๋•Œ๋Š” "๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค" ์ถœ๋ ฅ 

 

 

 

โ–ถ ์†Œ์Šค๋ณด๊ธฐ

๋”๋ณด๊ธฐ

์šฐ์„  html ๋‚ด์— todo_item์€ ๋”์ด์ƒ ํ•„์š”๊ฐ€ ์—†์œผ๋‹ˆ ์ฃผ์„ ์ฒ˜๋ฆฌ ํ•˜๊ฑฐ๋‚˜, ์‚ญ์ œํ•ด ์ฃผ์„ธ์š”. 

javascript ์—์„œ ์•Œ์•„์„œ render๋ฅผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    // index.html
    <div class="wrapper">
        <div class="form">
            <input type="text" class="todo_input">
            <button class="btn_add">ADD</button>
            <button class="btn_clear">CLEAR</button>
        </div>
        <div class="todo_list_wrap">
            <ul class="todo_list">
                <!-- ํŽธ์ง‘๊ธฐ๋Šฅ ํ™œ์„ฑํ™” : todo_item + edit_wrap -->
                <!-- <li class="todo_item ">
                    <div class="edit_wrap">
                        <input type="text" class="edit_input" />
                        <button class="button btn_edit">EDIT</button>
                    </div>
                    <p class="text">
                        Hello world!
                    </p>
                    <button class="button btn_amend">Amend</button>
                    <button class="button btn_delete">Delete</button>
                </li> -->
            </ul>
        </div>
    </div>

 

์šฐ์„  ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. 

let listArray = []; // ํ• ์ผ์ด ๋‹ด๊ธธ ๋ฐฐ์—ด
const todoList = document.querySelector('.todo_list'); // ๋ฐฐ์—ด์˜ ๋ชฉ๋ก์„ ๋ฟŒ๋ ค์ค„ ๋ถ€๋ชจ 
const todoInput = document.querySelector('.todo_input'); // ํ• ์ผ์˜ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜๋Š” input
const btnAdd = document.querySelector('.btn_add'); // ์ž…๋ ฅ ์™„๋ฃŒํ›„ ์ถ”๊ฐ€๋ฅผ ํ•˜๊ธฐ์œ„ํ•œ ๋ฒ„ํŠผ

 

๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ ๋‘ ๊ฐœ๋ฅผ ๋งŒ๋“ค์–ด์ค„ ํ…๋ฐ ํ•˜๋‚˜๋Š” ์‹ค์ œ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„๋•Œ ์ถ”๊ฐ€๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ํ•จ์ˆ˜์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ฐฐ์—ด์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์„๋•Œ html์— ๋ฟŒ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. 

// add list
const addTodo = () => {
	// ํ• ์ผ์„ listArray ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
}


// show list
const showList = () => {
	// html์— ๋ฟŒ๋ ค์ค๋‹ˆ๋‹ค.
}

btnAdd.addEventListener('click', addTodo);

 

addTodo ์—์„œ ๋งŒ์•ฝ input์˜ value ๊ฐ’์ด ๋น„์–ด์žˆ๋‹ค๋ฉด alert์„ ๋„์›Œ์ค€ ํ›„ input์œผ๋กœ ๋‹ค์‹œ focusํ•ด์ค๋‹ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๋™์ž‘์ด ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ return false๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค. 

๋งŒ์•ฝ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด, listArray์— ํ•ด๋‹น value๊ฐ’์„ pushํ•˜์—ฌ ์ถ”๊ฐ€ํ•ด ์ค€ ๋’ค, 

input์˜ value๊ฐ’์„ ๋นˆ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ค๋‹ˆ๋‹ค. 

์šฐ์„ ์„ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ํ•จ์ˆ˜๋Š” ์•„์ง ์ •์˜๊ฐ€ ์•ˆ๋˜์—ˆ์œผ๋ฏ€๋กœ, console๋กœ ๋ฐฐ์—ด์„ ์ฐ์–ด์„œ ํ™•์ธํ•ด ๋ด…์‹œ๋‹ค.

 

const addTodo = () => {
    const inputValue = todoInput.value; // input์˜ value๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค
    if(inputValue === "") { // input ์˜ value ๊ฐ’์ด ๋น„์–ด์žˆ๋‹ค๋ฉด
        alert("๊ฐ’์„ ์ž…๋ ฅํ•˜์„ธ์š”!"); // alert์„ ๋„์šฐ๊ณ 
        todoInput.focus(); // input์— ๋‹ค์‹œ focus๋ฅผ ์‹œ์ผœ์ค๋‹ˆ๋‹ค.
        return false; // ๋’ค์˜ ๋™์ž‘์„ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. 
    }
    
    // ๋งŒ์•ฝ value๊ฐ’์ด ์žˆ๋‹ค๋ฉด 
    listArray.push(inputValue);  // listArray์— value๊ฐ’์„ ์ถ”๊ฐ€ํ•ด ์ค๋‹ˆ๋‹ค. 
    // ๊ทธ๋ฆฌ๊ณ  input์˜ ๊ฐ’์„ ๋น„์›Œ์ค๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ „์— ์ž…๋ ฅํ•œ ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    todoInput.value = ""; 
    console.log(listArray) // ์ž˜ ์ถ”๊ฐ€๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ด…๋‹ˆ๋‹ค!
}
๊ฒฐ๊ณผํ™”๋ฉด

์•„์ฃผ ์ž˜ ๋˜๋„ค์š”. ๊ทธ๋Ÿฌ๋ฉด ์‹ค์ œ๋กœ html์— ๊ทธ๋ ค์ค๋‹ˆ๋‹ค.  ์ „์— ์ฃผ์„ํ•ด๋†“์•˜๋˜ todo_item ์„ ๊ทธ๋ž˜๋„ ๊ทธ๋ ค์ค„ ๊ฑด๋ฐ, ํ…์ŠคํŠธ ๋Œ€์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•ด ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. listArray์˜ length๊ฐ’์„ ์ฒดํฌํ•˜์—ฌ 0 ์ธ๊ฒฝ์šฐ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์•„์ง ํ• ์ผ ๋ชฉ๋ก์ด ์•„๋ฌด๊ฒƒ๋„ ์—†๋‹ค๋Š” ๋œป์ด๋‹ˆ "๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค"๋ฅผ ์ถœ๋ ฅํ•ด ์ฃผ๊ณ , 1๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ ค์ค๋‹ˆ๋‹ค. 

// show list
const showList = () => {
    if(listArray.length > 0) { // ๋ฐ์ดํ„ฐ๊ฐ€ 0๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ ์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
        todoList.innerHTML = ""; // ์šฐ์„  ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•˜์—ฌ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค๋‹ˆ๋‹ค. 
        listArray.forEach(function(text, idx){ // ๊ทธ๋ฆฌ๊ณ  forEach๋ฅผ ํ†ตํ•˜์—ฌ ๋ฐฐ์—ด์˜ ๊ฐœ์ˆ˜๋งŒํผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
            const itemTag = '<li class="todo_item ">' + 
                                '<div class="edit_wrap">' + 
                                    '<input type="text" class="edit_input" value="'+text+'" />' +
                                    '<button class="button btn_edit" onClick="amendTodo('+idx+')">EDIT</button>' +
                                '</div>' +
                                '<p class="text">'+ text +'</p>' +
                                '<button class="button btn_amend" onClick="activeEdit('+idx+')">Amend</button>' +
                                '<button class="button btn_delete" onClick="deleteTodo('+idx+')">Delete</button>' +
                            '</li>'
            todoList.innerHTML += itemTag // innerHTML๋กœ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. 
        });
    } else { // ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ 
        todoList.innerHTML = "<li>๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค</li>";
    }
}

 ์ด๋ ‡๊ฒŒ ํ•œ ๋’ค ์ถ”๊ฐ€ํ• ๋•Œ์—๋„ console ๋Œ€์‹  showList ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

 

* ์ตœ์ข…์†Œ์Šค

let listArray = [];
const todoList = document.querySelector('.todo_list');
const todoInput = document.querySelector('.todo_input');
const btnAdd = document.querySelector('.btn_add');



// add list
const addTodo = () => {
    const inputValue = todoInput.value;
    if(inputValue === "") {
        alert("๊ฐ’์„ ์ž…๋ ฅํ•˜์„ธ์š”!");
        todoInput.focus();
        return false;
    }
    listArray.push(inputValue);
    todoInput.value = "";
    showList()
}


// show list
const showList = () => {
    if(listArray.length > 0) {
        todoList.innerHTML = "";
        listArray.forEach(function(text, idx){
            const itemTag = '<li class="todo_item ">' + 
                                '<div class="edit_wrap">' + 
                                    '<input type="text" class="edit_input" value="'+text+'" />' +
                                    '<button class="button btn_edit" onClick="amendTodo('+idx+')">EDIT</button>' +
                                '</div>' +
                                '<p class="text">'+ text +'</p>' +
                                '<button class="button btn_amend" onClick="activeEdit('+idx+')">Amend</button>' +
                                '<button class="button btn_delete" onClick="deleteTodo('+idx+')">Delete</button>' +
                            '</li>'
            todoList.innerHTML += itemTag
        });
    } else {
        todoList.innerHTML = "<li>๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค</li>";
    }
}


btnAdd.addEventListener('click', addTodo);
showList()

 

 

 


2. ๊ธ€ ์‚ญ์ œํ•˜๊ธฐ

๊ธฐ๋Šฅ๋ชฉ๋ก

 - "Delete" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•ด๋‹น ์•„์ดํ…œ ์‚ญ์ œ
 - "CLEAR" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ชจ๋“  ์•„์ดํ…œ ์‚ญ์ œ 

 

 

 

โ–ถ ์†Œ์Šค๋ณด๊ธฐ

๋”๋ณด๊ธฐ

๊ธ€ ์‚ญ์ œํ•˜๊ธฐ๋Š” ์ด๋ฏธ ๋ฟŒ๋ ค์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ๋งŒ๋“ค์–ด์ ธ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์ข€ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. 

ํด๋ฆญํ–ˆ์„๋•Œ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ, ํด๋ฆญ ํ–ˆ์„๋•Œ ์ „๋ถ€ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ 2๊ฐ€์ง€๋งŒ ์ถ”๊ฐ€ํ•ด ์ฃผ๋ฉด๋ฉ๋‹ˆ๋‹ค. 

์ด ๋ง์€, ํ•˜๋‚˜๋งŒ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฐ์—ด์—์„œ ํ•ด๋‹น ๊ธ€๋งŒ ๋ฐฐ์—ด์—์„œ ์‚ญ์ œํ•˜๊ณ , ๋ชจ๋‘ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

ํ•ด๋‹น ๊ธ€์„ ์ฐพ๊ธฐ์œ„ํ•ด์„œ id๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ index๊ฐ’์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

 

ํ•œ ๊ฐœ์˜ ๊ธ€๋งŒ ์ž˜๋ผ๋‚ด๊ธฐ ์œ„ํ•ด splice ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

splice(num1, num2) ์€ num1 ๋ฒˆ์งธ (0๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์„ธ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค) ๋ถ€ํ„ฐ num2 ๋งŒํผ ์ž˜๋ผ๋‚ด๊ฒ ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. 

var list = [1, 2, 3, 4, 5]
console.log(list.splice(2, 2)) // ์ž˜๋ ค๋‚˜๊ฐ„ ๊ฐ’ [3, 4]
console.log(list) // splice ์ดํ›„ list ์˜ ๊ฐ’ [1, 2, 5]

  

 

* ์ตœ์ข…์†Œ์Šค

{...}
const btnClear = document.querySelector('.btn_clear'); // ์ดˆ๊ธฐํ™” ๋ฒ„ํŠผ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

{ ... }

// delete todo - ํ•˜๋‚˜๋งŒ ์‚ญ์ œ
const deleteTodo = (idx) => {
    listArray.splice(idx, 1); // ๋ฐฐ์—ด์ค‘ idx ๋ฒˆ์งธ 1๊ฐœ๋ฅผ ์ž˜๋ผ ๋‚ด๊ฒ ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. 
    showList() // ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋€ ๊ฐ’์ด ๋‹ค์‹œ ๊ทธ๋ ค์งˆ ์ˆ˜ ์žˆ๋„๋ก showList๋ฅผ ํ˜ธ์ถœ ํ•ฉ๋‹ˆ๋‹ค.
}

// clear All - ๋ชจ๋‘ ์‚ญ์ œ
const clearAll = () => {
    listArray = [];  // ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™” ์‹œํ‚จ ๋’ค
    showList(); // ๋ฐ”๋€ ๊ฐ’์ด ๋‹ค์‹œ ๊ทธ๋ ค์งˆ ์ˆ˜ ์žˆ๋„๋ก showList๋ฅผ ํ˜ธ์ถœ ํ•ฉ๋‹ˆ๋‹ค.
}


// show list
const showList = () => {
	// btn_delete ๋ฒ„ํŠผ ๋ถ€๋ถ„์— onClick ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. idx๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค.
	{...}
         '<button class="button btn_delete" onClick="deleteTodo('+idx+')">Delete</button>' +
	{...}
        });
    } else {
        todoList.innerHTML = "<li>๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค</li>";
    }
}


btnAdd.addEventListener('click', addTodo);
btnClear.addEventListener('click', clearAll); 

showList()

 

 


3. ๊ธ€ ์ˆ˜์ •ํ•˜๊ธฐ

๊ธฐ๋Šฅ๋ชฉ๋ก

 - "Amend" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ edit ํ™”๋ฉด ์ถœ๋ ฅ ๋ฐ edit input์— ๊ธฐ์กด ๊ฐ’ ์ถœ๋ ฅ
 - edit input์ด ๋นˆ๊ฐ’์ธ ๊ฒฝ์šฐ "edit"๋ฒ„ํŠผ ํด๋ฆญ์‹œ "๊ฐ’์„ ์ž…๋ ฅํ•˜์„ธ์š”!" alert์„ ๋„์šดํ›„ input์œผ๋กœ focus

 

์ฐธ๊ณ  ์ด๋ฏธ์ง€

โ–ถ ์†Œ์Šค๋ณด๊ธฐ

๋”๋ณด๊ธฐ
showList ์•ˆ์— ๊ทธ๋ ค์ฃผ๋Š” ํƒœ๊ทธ ์•ˆ์— btn_amend์— activeEidtํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  idx๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊น๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  activeEdit ํ•จ์ˆ˜์—์„œ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ todo_item์— edit_active ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ํŽธ์ง‘ ํ™”๋ฉด์„ ํ™œ์„ฑํ™” ํ•ด์ค๋‹ˆ๋‹ค. 

 

์‹ค์ œ ์ˆ˜์ •์ด ์ €์žฅ ๋˜๋Š” ์—ญํ™œ์„ ์ˆ˜ํ–‰ ํ•˜๋Š” ๊ฒƒ์€ btn_edit ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— amendTodoํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  idx๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊น๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ splice๋ฅผ ํ†ตํ•˜์—ฌ ๊ฐ’์„ ์ˆ˜์ • ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” 3๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›๋Š”๋ฐ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ (num1, num2, num3) ์ด ์žˆ์„๋•Œ  num1๋ฒˆ์งธ์˜ ๊ฐ’ num2๋งŒํผ ์‚ญ์ œํ•˜๊ณ , num3์„ ์ถ”๊ฐ€ํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.  
var list = [1, 2, 3, 4, 5]
console.log(list.splice(1, 2, 3)) // 1๋ฒˆ์งธ ๋‘๊ฐœ์˜ ๊ฐ’์„ ์‚ญ์ œํ•˜๊ณ  3์„ ๋„ฃ๊ฒ ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
console.log(list)

// ๊ฒฐ๊ณผ
[2, 3]
[1, 3, 4, 5]

 ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŽธ์ง‘ํ™”๋ฉด์˜ input์ธ edit_input์—๋„ ๋นˆ๊ฐ’ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

 

* ์ตœ์ข…์†Œ์Šค

{...}

// edit_wrap active : ํŽธ์ง‘ ํŒ์—… ํ™œ์„ฑํ™” 
const activeEdit = (idx) => {
    const items = document.querySelectorAll('.todo_item');
    const item = items[idx];
    item.classList.add('edit_active');
}

// ์‹ค์ œ ์ˆ˜์ • ํ•˜๋Š” ํ•จ์ˆ˜ 
const amendTodo = (idx) => {
    const items = document.querySelectorAll('.todo_item');
    const item = items[idx];
    const newInput = item.querySelector('.edit_input');
    const newValue = newInput.value;

    if(newValue === "") {  // ๋นˆ๊ฐ’์ธ ๊ฒฝ์šฐ ์ฒดํฌ!
        alert("๊ฐ’์„ ์ž…๋ ฅํ•˜์„ธ์š”");
        newInput.focus();
    } else {
        listArray.splice(idx, 1, newValue); // idx๋ฒˆ์งธ 1๊ฐœ์˜ ๊ฐ’์„ newValue๋กœ ๊ต์ฒด
        item.classList.remove('edit_active'); // ๊ทธ๋ฆฌ๊ณ  ์ž๋™์œผ๋กœ edit ํ™”๋ฉด์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
        showList(); // ๋‹ค์‹œ ๊ทธ๋ ค์ฃผ๋ฉด ์ˆ˜์ •๋œ ๋‚ด์—ญ์ด ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค!
    }
}


// show list
const showList = () => {
    if(listArray.length > 0) {
        todoList.innerHTML = "";
        listArray.forEach(function(text, idx){
            const itemTag = '<li class="todo_item ">' + 
                                '<div class="edit_wrap">' + 
                                    '<input type="text" class="edit_input" value="'+text+'" />' +
                                    '<button class="button btn_edit" onClick="amendTodo('+idx+')">EDIT</button>' +
                                '</div>' +
                                '<p class="text">'+ text +'</p>' +
                                '<button class="button btn_amend" onClick="activeEdit('+idx+')">Amend</button>' +
                                '<button class="button btn_delete" onClick="deleteTodo('+idx+')">Delete</button>' +
                            '</li>'
            todoList.innerHTML += itemTag
        });
    } else {
        todoList.innerHTML = "<li>๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค</li>";
    }
}


btnAdd.addEventListener('click', addTodo);
btnClear.addEventListener('click', clearAll);

showList()

 

 

 

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐฐ์—ด๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Vanila JavaScript ๋กœ ๋งŒ๋“  ์†Œ์Šค๊ฐ€ ์™„์„ฑ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ‘

 

 

 

๋ฐ˜์‘ํ˜•