- mouseover / mouseout
- event.target / event.relatedTarget
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.first{
background:skyblue;
width:10%;
}
.second{
background:green;
width:10%;
}
.third{
background:red;
width:10%;
}
</style>
</head>
<body>
<div id='exam3' class='third' >3층</div>
<div id='exam2' class='second' >2층</div>
<div id='exam1' class='first'>1층</div><br>
<button onclick='over()'>onmouseover 사용</button>
<button onclick='out()'>onmouseout 사용</button>
<script>
let exam3 = document.getElementById('exam3');
let exam2 = document.getElementById('exam2');
let exam1 = document.getElementById('exam1');
let onover = false, onout = false;
exam3.onmouseover = ()=>{
if(event.relatedTarget.tagName=='DIV' && onover == true)
alert(`mouseover에 의해 ${event.relatedTarget.innerHTML}에서 ${event.target.innerHTML}로 옮겨갔다.` )
}
exam2.onmouseover = ()=>{
if(event.relatedTarget.tagName=='DIV' && onover == true)
alert(`mouseover에 의해 ${event.relatedTarget.innerHTML}에서 ${event.target.innerHTML}로 옮겨갔다.` )
}
exam1.onmouseover = ()=>{
if(event.relatedTarget.tagName=='DIV' && onover == true)
alert(`mouseover에 의해 ${event.relatedTarget.innerHTML}에서 ${event.target.innerHTML}로 옮겨갔다.` )
}
exam3.onmouseout =()=>{
if(event.relatedTarget.tagName=='DIV' && onout == true)
alert(`mouseout에 의해 ${event.target.innerHTML}에서 ${event.relatedTarget.innerHTML}로 옮겨갔다.` )
}
exam2.onmouseout = ()=>{
if(event.relatedTarget.tagName=='DIV' && onout == true)
alert(`mouseout에 의해 ${event.target.innerHTML}에서 ${event.relatedTarget.innerHTML}로 옮겨갔다.` )
}
exam1.onmouseout = ()=>{
if(event.relatedTarget.tagName=='DIV' && onout == true)
alert(`mouseout에 의해 ${event.target.innerHTML}에서 ${event.relatedTarget.innerHTML}로 옮겨갔다.` )
}
function over(){
onover = true;
onout = false;
}
function out(){
onover = false;
onout = true;
}
</script>
</body>
</html>
짧게 정리하면 onmouseover 버튼 클릭시 해당 div(1,2,3층 전부포함) 하나에서 다른 div로 이동 할 경우 이동에 대한
alert
이 발생한다. onmouseout 버튼도 마찬가지이다.
위의 코드에서 event.target과 event.relatedTarget은
mouseover
과mouseout
에 의해 달라진다.
mouseover
event.target – 마우스가 온 요소입니다.
event.relatedTarget– 마우스가 나온 요소입니다 ( relatedTarget→ target).
mouseout
event.target – 마우스가 떠난 요소입니다.
event.relatedTarget– 마우스가 ( target→ relatedTarget)를 위해 떠난 새로운 포인터 아래 요소 입니다.
그래서
alert
코드에서 mouseover와 mouseout의 event.target 위치가 다르다
(event.target , event.relatedTarget은 태그를 나타냄)
mouseover && mouseout과 다르게
버블링
이 불가능하다.
Element 에서부터 closest() 메소드를 통해 자신부터 부모 요소 단위로 출발하여 각 요소가 지정한 선택자에 만족할 때까지 탐색한다(문서 루트까지 이동). 이 중 가장 가깝게 조건에 만족한 부모 요소가 반환되며, 조건에 만족한 요소가 없으면 null 값을 반환
ex)
<html>
<head>
</head>
<body>
<article>
<div id="div-01">Here is div-01
<div id="div-02">
Here is div-02
<div id="div-03">Here is div-03</div>
</div>
</div>
</article>
</body>
<script>
var el = document.getElementById('div-03');
var r1 = el.closest("#div-02");
// id=div-02 조건이 만족하므로 속성을 가진 부모 요소가 반환된다.
var r2 = el.closest("div div");
// div 요소에 만족한 요소 중 div 자식을 가리키므로, id=div-03 자신이 만족된다.
var r3 = el.closest("article > div");
// 가장 가까운 article 요소 바로 하위의 div 요소 id=div-01 속성을 가진 요소가 반환된다.
var r4 = el.closest(":not(div)");
// div 요소가 아닌 가장 가까운 부모 article 요소가 반환된다.
console.log(r1)
console.log(r2)
console.log(r3)
console.log(r4)
</script>
</html>
결과
이를 통해 위에서 사용하던
event.target
과event.relatedTarget
을event.target.closest()
이나event.relatedTarget.closest()
로 필요에따라 사용할 수 있다.
첫번째 예제에서 exam1, 2, 3을 포함하는 div를 추가해 여기에 이벤트를 걸어서 이벤트 위임 방식으로 해봐도 좋을 것 같네요. 될 때 한번 해봐야겠어요 좋은 예시네요 잘 읽었습니다!