기초공사 (html,css,javascript)
6번 board - 모달창에 삭제 수정 - 버튼의글까지 나옴.--해결 --또다른 issue --미완료 본문
academy/JavaScript
6번 board - 모달창에 삭제 수정 - 버튼의글까지 나옴.--해결 --또다른 issue --미완료
에스프레소라떼 2024. 5. 18. 12:47//
저 코드를 이용한다.!!
// 스스로 풀이시작
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
<!-- <script defer src="js/dom04.js"></script> -->
<script defer src="js/dom0506.js"></script>
<style>
.content {
width: 1024px;
}
.disp {
height: 200px;
border: 1px solid black;
}
.tab_host {
display: flex;
margin-top: 20px;
text-align: center;
}
.tab:hover {
cursor: pointer;
}
.tab {
width: 200px;
border: 1px solid #ededed;
}
#list {
border: 1px solid #ededed;
}
/* modal*/
/* 모달창 기본 스타일 */
.modal {
display: none;
position: fixed;
z-index: 1;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgb(0, 0, 0); /* Fallback color */
background-color: rgba(0, 0, 0, 0.4); /* Black w/ opacity */
}
/* 모달 내용 스타일 */
.modal-content {
background-color: #fefefe;
margin: 15% auto;
padding: 20px;
border: 1px solid #888;
width: 80%;
}
</style>
</head>
<body>
<p>
4. 아래의 입력창에 숫자가 입력되지 않도록 하고 길이 제한은 10자로 하시오.
<br />
숫자가 입력된다면 숫자가 입력되었다고 alert로 알려주시오
</p>
<input
type="text"
id="te_input"
maxlength="9"
placeholder="글자만 입력하세요."
/>
<p>
5.아래의 입력창에 입력 후 저장 버튼을 누르거나 엔터키를 누르면 입력한
내용이 아래의 list에 추가 되도록 하시오.
<br />초기화 버튼을 누르면 list안의 모든 내용이 지워져야 함
</p>
<h5>6.추가된 내용을 "각각" 수정 및 삭제 수 있게 변경하시오.</h5>
<!-- ------------------------------------------------------------ -->
<form id="form">
<input type="text" value="" width="600" id="list_data" name="content" />
<button type="submit" id="send" value="show_view">저장</button>
<button type="reset" id="reset_one">초기화</button>
<p>리스트</p>
<ul id="list">
<li class="liclass">list</li>
<li class="liclass">list</li>
</ul>
</form>
<!-- modal -->
<!-- 모달 구조 -->
<div id="myModal" class="modal">
<!-- 모달 내용 -->
<div class="modal-content">
<span class="close">X</span>
<p>수정 사항을 입력.</p>
<input type="text" id="modalInput" />
<button id="modalSave">저장</button>
</div>
</div>
</body>
</html>
js
/*
5번.
1.input의 공간
2. 저장버튼 / 초기화버튼
3. 저장하면 어디에 생기게? ul인 #list-- 부모
- document.createElement("li")
- li.textConent = "liclass"
- 부모.append(변수)
6번.
수정,삭제하기
*/
const $input = document.querySelector("#list_data");
const $saveBtn = document.querySelector("#send");
const $resetBtn = document.querySelector("#reset_one");
const $ul_list = document.querySelector("#list"); //ul
const $items = document.querySelectorAll("li"); // li들
console.log($items);
//요소만든다.
function update() {
const $li = document.createElement("li");
$li.className = "liclass";
// $li.textContent = $input.value;
$ul_list.appendChild($li);
// 삭제버튼
const $removeBtn = document.createElement("button");
$removeBtn.className = "remove_btn";
$removeBtn.textContent = "삭제";
$removeBtn.addEventListener("click", (e) => {
e.stopPropagation();
$removeBtn.parentNode.remove();
const target = e.target.parentNode;
console.log(target);
});
// 수정버튼
const $modifyBtn = document.createElement("button");
$modifyBtn.className = "modify_btn";
$modifyBtn.textContent = "수정";
// $span.textContent = $input.value;
// 텍스트를 담을 별도의 요소 생성
const $textContent = document.createElement("span");
$textContent.textContent = $input.value;
$li.append($textContent, $removeBtn, $modifyBtn); // li의 자식이 생김.
// 수정버튼시 prompt
$modifyBtn.addEventListener("click", (e) => {
e.preventDefault();
e.stopPropagation();
// 수정버튼시 modal 나온다.
// $li.textContent = 모달input.value
// 저장버튼 시
// - 모달input.value = $li.textContent
// - $li.textContent에서 자식요소가 텍스트, 삭제버튼, 수정버튼이 있다.
// - 텍스트를 span 요소를 만들어서 span안에 텍스트를 넣어놓자!
const $modal = document.getElementById("myModal"); // 전체모달
const $modaContent = document.getElementsByClassName("modal-content");
const $modalInput = document.querySelector("#modalInput"); //input
const $modalSaveBtn = document.getElementById("modalSave");
//let currentLi; // 현재 수정하고자 하는 li 요소를 저장하기 위한 변수-- 없어도 되긴됨.
// $modalInput.value = $li.textContent;
$modal.style.display = "block";
console.log($modalInput.value);
// currentLi = $li;
// console.log(target); // button수정이 선택
// console.log(target.parentNode); //li
// li의 #text를 선택하면 된다.--#text를 어떻게 선택해?..
// 그러므로 span요소를 만들자
const target = e.currentTarget;
const targetParent = target.parentNode;
console.log(targetParent); // li가 나옴
for (const child of targetParent.children) {
// targetParent.chlidren는 text, 삭제버튼, 수정버튼
// 그럼 child는 $textContent, 삭제버튼, 수정버튼의 각 자식들...
console.log(child);
$modalInput.value = targetParent.textContent;
if (child.matches("span")) {
//
// $modalInput.value = child.childNodes[0].textContent; // 이렇게 해도 되고.
$modalInput.value = child.innerText;
break; //<span> 태그를 찾았으므로 더 이상 순회할 필요 없음
}
}
const $close = document.querySelector(".close");
//위의것을 getElementsClassName으로 하면 선택이 안된다..왜????
$close.addEventListener("click", () => {
$modal.style.display = "none";
});
// 모달창에서 저장하기
$modalSaveBtn.addEventListener("click", () => {
$li.textContent = $modalInput.value;
$modal.style.display = "none";
});
});
}
//저장할떄
$saveBtn.addEventListener("click", (e) => {
e.preventDefault();
// 입력 값이 빈 문자열인 경우 alert 표시
// 검색 trim()메소드 : 입력 값의 앞뒤 공백을 제거한 뒤 빈 문자열인지 확인
if ($input.value.trim() === "") {
alert("글을 입력하시오");
} else {
update();
$input.value = "";
}
});
// 초기화 버튼 클릭하면 모두 사라진다.
$resetBtn.addEventListener("click", () => {
$ul_list.innerHTML = ""; // 초기화.
});
issue
저장하기 클릭하면 모달창이 뜨면서 모달input의 내용이 버튼의 글까지 나오는 이슈가 있었다.
해결방법
1. li에 글만 저장되도록 하는 span요소태그를 만든다.
그래서 li.apeen($span, 삭제버튼, 수정버튼)을 놔둔다.
2. 아래 코드를 입력한다.
const target = e.currentTarget;
const targetParent = target.parentNode;
console.log(targetParent); // li가 나옴
for (const child of targetParent.children) {
// targetParent.chlidren는 text, 삭제버튼, 수정버튼
// 그럼 child는 $textContent--> span태그 , 삭제버튼, 수정버튼의 각 자식들...
console.log(child);
$modalInput.value = targetParent.textContent;
if (child.matches("span")) {
$modalInput.value = child.childNodes[0].textContent; // 이렇게 해도 되고.span태그의 첫번째자식
$modalInput.value = child.innerText; // 아래처럼 해도 된다.--span태그의 innerText
break; //<span> 태그를 찾았으므로 더 이상 순회할 필요 없음
}
}
위의코드로 해결됨.
그러나 또 다른 이슈가 기다리고 있다.
모달창에서 저장하기 클릭 후 모달창이 닫히기는 하나, 모두 바껴버린다.
1.li에 하나의 목록만 있으면 잘 바뀌나, 여러개 있으면 모두 바뀌어 버린다. 내가 선택한 li의 글만 바뀌게 하고 싶고.
2. 삭제버튼과 수정버튼이 없어지지 않아야한다.
'academy > JavaScript' 카테고리의 다른 글
splice와 indexOf예제 (0) | 2024.05.20 |
---|---|
책 - 함수형코딩 (0) | 2024.05.18 |
childrenNodes / children (0) | 2024.05.14 |
과제-타이머 만들기- 안되는 이유-코드로.-해결 (0) | 2024.05.13 |
axios cdn 다운로드- 설치 (0) | 2024.05.12 |