아래와 같은 html에서 같은 class를 가진 요소들을 선택하고 클릭 이벤트가 발생하면 특정 함수를 실행시키고 싶었다.

선택할 타겟은 'target_by_One' 의 <dd> 태그.

<dl class="targetList" id="centerList01">
    <dd class="center01 call target_by_One">...</dd>
    <dd class="center02 call target_by_One">...</dd>
</dl>

이때 요소에 접근하기 위해 querySelectorAll 을 사용한다. 

필요한 것은 target_by_One 이 붙은 모든 요소이기 때문에 querySelectorAll() 을 사용했다.

만약 첫번째 요소 하나만 필요하다면, 하나의 반환 객체만을 가지는 querySelector() 를 사용하면 된다. 

 

 

클래스로 접근하기 때문에 '.target_by_One' 을 인수로 넣었다. (만약 id 라면 . 을 # 로 변경해주면 된다.)

let targetFirst = document.querySelectorAll('.target_by_One');

🔻NodeList(2) [dd.center01.callKeyword.keyword_by_One, dd.center02.callKeyword.keyword_by_One]
   ▶0: dd.center01.callKeyword.keyword_by_One
   ▶1: dd.center02.callKeyword.keyword_by_One
   length: 2
   ▶__proto__: NodeList


targetFirst 를 console로 찍어보면 결과는 위와 같다.

querySelectorAll은 반환객체로 NodeList 를 가져온다. 일단 원하는 요소는 가지고 오는데 성공했다.

 


 

 

이제 클릭 이벤트 실행 시 특정 함수를 실행하도록 한다. 

원하는 요소를 찾았는데 반환한 객체가 NodeList 기 때문에 for 또는 forEach 를 사용해 클릭이벤트를 붙여줘야한다. 

let targetFirst = document.querySelectorAll('.target_by_One');
targetFirst.forEach((target) => target.addEventListener("click", jsSearch));

addEventListener 를 사용하면 깔끔하다. 

 

1번째 인자에는 이벤트명을 입력한다.

2번째 인자에는 첫번째 이벤트가 발생하면 실행할 콜백함수를 입력한다. 

 

이제 targetFisrt 에 들어있는 '.target_by_One' 클래스가 붙은 태그를 클릭하면 jsSearch 함수가 실행된다.

 


 

위와같이 사용하면 아주 깔끔하게 붙일 수 있는데 하나더 문제가 있었다. 

click 이벤트 실행시, 실행 될 jsSearch 에 인자를 넘겨주면서 this 를 호출하면서 발생했다.

 

 

일단, 인자를 넘겨주는 방법이다.

아래와 같이 익명의 함수를 사용하여 인자를 넘겨주면 된다.

let targetFirst = document.querySelectorAll('.target_by_One');
targetFirst.forEach((target) => target.addEventListener("click", function(){ jsSearch('test'); }));

 

인자로 텍스트를 넘겨줬는데, jsSearch 안에서 this 를 호출한다. 

이때 호출하고 싶은 this 는 jsSearch 함수의 this 가 아니라 click 이벤트가 발생한 이벤트 핸들러의 this 였다. 

 

아래와 같이 this 를 호출할 경우, 함수의 주인에게 바인딩 되어 윈도우 객체를 가르킨다. 

function jsSearch(str){		
	var grandparent = this.parentNode;
	var targetId = this.querySelector('div.text').id;
	var targetText = this.querySelector('div.text').innerText;
};

 

그렇다면 바뀌어버린 this 를 찾기 위해서 다시 익명의 함수를 변경해준다. 

사실 방법은 간단하다. this 를 변수에 담아버리면 된다.

 

let targetFirst = document.querySelectorAll('.target_by_One');
targetFirst.forEach((target) => target.addEventListener("click", function(){ 
			var parent_this = this;
			jsSearch('test', parent_this); 
		})
	);




function jsSearch(str, parent_this){		
	var grandparent = parent_this.parentNode;
	var targetId = parent_this.querySelector('div.text').id;
	var targetText = parent_this.querySelector('div.text').innerText;
};            

 

parent_this 에 this 를 담고 인자로 넘겨주었다.

이벤트 리스너의 선택한 <dd> 가 잘 넘어오는걸 확인 할 수 있다!

 

 

 

++

 

더 쉽게 this 를 받는 방법 

target 을 바로 인자로 넘겨주면 된당 ㅎㅎㅎ 

let targetFirst = document.querySelectorAll('.target_by_One');
targetFirst.forEach((target) => target.addEventListener("click", function(){ 
			jsSearch('test', target); 
		})
	);




function jsSearch(str, target){		
	var grandparent = target.parentNode;
	var targetId = target.querySelector('div.text').id;
	var targetText = target.querySelector('div.text').innerText;
};            

 

 

 

 

 


 

 

 

[참고]

javacpro.tistory.com/36

 

[JavaScript] querySelector() , querySelectorAll() 자바스크립트 요소접근

querySelector() , querySelectorAll()  요소접근 querySelector() querySelector 는 특정 name 이나 id 를 제한하지않고 css선택자를 사용하여 요소를 찾습니다. (#sections) -> sections 아이디를 가진 요소를..

javacpro.tistory.com

chlolisher.tistory.com/10

 

[ JavaScript ] Event의 종류 : addEventListener, removeEventListener 메서드

addEventListener : 특정 이벤트가 발생했을 시, 특정 함수를 실행할 수 있게 해주는 기능.  addEventListener으로 등록할 수 있는 이벤트 중 자주 쓰이는 이벤트 목록 이벤트 명 설명 change 변동이 있을 때

chlolisher.tistory.com

nykim.work/71

 

[JS] 자바스크립트에서의 this

this는 이것을 뜻합니다! (그러니까 '이게' 뭐죠...... 😵) 자바스크립트 내에서 this는 '누가 나를 불렀느냐'를 뜻한다고 합니다. 즉, 선언이 아닌 호출에 따라 달라진다는 거죠. 그럼 각 상황별로 th

nykim.work

www.zerocho.com/category/JavaScript/post/5b0645cc7e3e36001bf676eb

 

(JavaScript) 자바스크립트의 this는 무엇인가?

안녕하세요. 이번 시간에는 자바스크립트 this에 대해 알아보겠습니다. 사실 이미 실행 컨텍스트 강좌 에 다 설명해둔 것이긴 한데요. 그 강좌는 실행 컨텍스트(전체적인 흐름)에 더 집중해서 쓰

www.zerocho.com

 

'Javascript' 카테고리의 다른 글

[javascript] form 데이터 JSON 형식으로 변환  (0) 2020.03.27