1. 우클릭이벤트 실행 addEventListener(‘contextmenu’, function(){})
우클릭시 이벤트실행은 contextmenu사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
//step5. 우클릭하면 깃발모양만들기 td.addEventListener('contextmenu', function(e){ e.preventDefault(); console.log('우클릭'); //우클릭한 곳이 몇번째줄 몇번째칸인지 알아야하니까 currentTarget 사용 var 부모tr = e.currentTarget.parentNode; var 부모tbody = e.currentTarget.parentNode.parentNode; //var 칸 = 부모tbody.children.indexOf(tr) 부모tr이 배열이 아니라서 indexOf적용안됨. 부모tbody는 유사배열임 //indexOf를 쓰고 싶은데 배열이 아닌 애들한테 강제로 쓰는 법은 아래와 같이 Array.prototype.indexOf.call()를 사용 var 칸 = Array.prototype.indexOf.call(부모tr.children, e.currentTarget); var 줄 = Array.prototype.indexOf.call(부모tbody.children, 부모tr); console.log( 칸, ':', 줄);
e.currentTarget.textContent = '!'; dataset[줄][칸] = '!'; //데이터와 화면일치를 위해 꼭 필요. 이게 불편해서 react를 많이 씀 });
2. event.target VS event.currentTarget
언뜻보면 이벤트가 일어난 곳을 둘 다 알 수 있는 것 같지만, 차이가 있다.
target은 이벤트리스너가 발생하는 대상(내가 클릭한 td)
currentTarget은 이벤트리스너를 단 대상(내가 클릭한 td가 속해있는 테이블 전체)
td.addEventListener('click', function(e){ var 부모tr = e.currentTarget.parentNode; var 부모tbody = e.currentTarget.parentNode.parentNode; var 칸 = Array.prototype.indexOf.call(부모tr.children, e.currentTarget); var 줄 = Array.prototype.indexOf.call(부모tbody.children, 부모tr); if(dataset[줄][칸] === 'X'){ e.currentTarget.textContent = '펑!'; }else{ var 주변 = [dataset[줄][칸-1], dataset[줄][칸+1] ]; if(dataset[줄-1]){ 주변 = 주변.concat(dataset[줄-1][칸-1], dataset[줄-1][칸], dataset[줄-1][칸+1]); } if(dataset[줄+1]){ 주변 = 주변.concat(dataset[줄+1][칸-1], dataset[줄+1][칸], dataset[줄+1][칸+1]); } e.currentTarget.textContent = 주변.filter(function(v){ //배열에서 필터링하는 함수 return v === 'X' }).length; } })