js 수료해야하는데 .. 코드 흐름을 전혀 모르는 나는 시험을 통과못하고..
재시를 치게되는데..
<ul>
<li class="select one" id="one">
<i class="check_icon"></i>
</li>
</ul>
//1 로직 바꿈
function handleClick(e){
if (e.target.matches('.favorites-icon.on')) {
return;
}else{
this.classList.toggle('on'); //error! event 안들어감!
}
console.log('works');
}
// 2 변수 dom도 바꿔봄 -getElementById
const target2 = document.getElementById('second-favorites-icon')
// 2 변수 dom도 바꿔봄 -querySelector;
const target3 = document.querySelector('i.third-favorites-icon');
// 2 변수 dom도 바꿔봄 - querySelectorAll
var targets = document.querySelectorAll('i.favorites-icon');
//3 css 문제인듯해 바꿈 i 태그를 css가 인식못하는 해 div 태그 하단에 위치하게 함
div {
display: block;
width: 50px;
height: 50px;
background-color: #ccc;
margin-bottom: 10px;
}
div > .favorites-icon {
background-color: #ccc;
display: block;
width: 50px;
height: 50px;
margin-bottom: 10px;
}
div > .favorites-icon.on {
background-color: yellow;
}
status: getElementById 를 버리고 queryselectorAll 을 이용해서 변수를 쓰고있는데
addEventListener 가 함수가 아니라면서 계속 에러 오류가 나옴
solv
//index.html
<i id="first-favorites-icon" class="favorites-icon"></i>
<i id="second-favorites-icon" class="favorites-icon"></i>
<i id="third-favorites-icon" class="favorites-icon"></i>
//index.js
var targets= document.querySelectAll('i.favorites-icon')
for (const key of targets) {
key.addEventListener('click', handleClick);
}
위와 같이 똑같은 class명의 태그가 여러개다 보니, index를 지정하던지 for 문을 써서 전체에 event를 걸어줘야했다.
TypeError: addEventListener is not a function in JavaScript
var targets = document.querySelectorAll(' .favorites-icon');
//위에서 아래로 변경해야함.
var targets = document.querySelectorAll('i.favorites-icon');
how-to-create-event-listeners-for-icons
status : 문제에서 this를 이용하라고 하는데 , 감도 안오고 e.target.value만 되뇌이는 나... 어떻하죠..
위에서 어느정도 힌트를 얻음 그러나 matches가 잘 되지 않는 듯 해 포기함.
function handleClick(e) {
// try 1
if (!targets.matches(' .favorites-icon *')) {
this.classList.toggle('on');;
}
this.classList.remove('on');
};
// try 2
if (!targets.matches('.favorites-icon .favorites-icon.on ')) {
this.classList.toggle('on');;
}
this.classList.remove('on');
};
//try 3
if (!targets.matches('.on')) {
this.classList.toggle('on');
}
this.classList.remove('on');
};
this.classList.toggle('on');
꾸준히 이 메서드를 이용해서 해결해보려했는데, 사용 이해를 다 못한듯.. 결국 사용 실패. 잘 쓰면 for 문이나 if 문 안써도 될 것 같은데! // if visible is set remove it, otherwise add it
div.classList.toggle("visible");
원인 : 일단 내가 classListan문법을 모르는 상태에서 문제 조건에 맞춰쓰려하다보니 잘 이해가 되지않아 공식문서를 계속 읽어봄
add,remove,toggle 등 주요 3가지 메서드를 돌아가면서 써보았는데 처음 toggle을 쓰다가
결국 add로 해결함
solv
function handleClick() {
for (const key of targets) {
key.classList.remove('on');
this.classList.add('on');
}
console.log('works');
}
status : 일단 기능 구현이 되니 리팩토링하면서 잡아보자 싶었다
아래글을 참조하면서 하나씩 삭제해보았다.
불좀꺼줄래?2
try :
"select one"
으로 클래스 명이 띄어져있을때 css 선택자가 .select.one
으로 연결되는 부분이 신기해서 가져옴. .select#one
으로도 css가 적용 되긴함. //idex.html
<li class="select one" id="one">
<i class="check_icon"></i>
</li>
//index.css
.select.one {
background-color: #b3b3b3;
}
컨텐트의 크기 만큼만 공간을 차지하도록
되어있다고 한다 전후 줄바꿈 없이 한 줄에 다른 엘리먼트들과 나란히 배치되지만, block 엘리먼트처럼 width와 height 속성 지정 및 margin과 padding 속성의 상하 간격 지정이 가능합니다.
span {
display: inline-block;
background: yellow;
width: 200px;
height: 50px;
margin: 20px;
padding: 10px;
}
//index.css
/* ol,
ul {
list-style: none;
} */
/* .select {
display: block;
width: 50px;
height: 50px;
background-color: #ccc;
margin-bottom: 10px;
}
*/
/*
div {
display: block;
width: 50px;
height: 50px;
background-color: #ccc;
margin-bottom: 10px;
} */
/* .on {
display: none;
width: 50px;
height: 50px;
background-color: yellow;
margin-bottom: 10px;
} */
// index.html
<!-- <ul>
<li class="select" id="one"> -->
<!-- <div> -->
<!-- </li> -->
<!-- <li class="select" id="two"> -->
<!-- </li> -->
<!-- <li class="select" id="three"> -->
<!-- </li> -->
<!-- </ul> -->
<!-- </div> -->