[JavaScript] ES6 chap.1

 

 

 

this

1. 아무데서 쓰거나 일반 함수에서의 this는 window

<script>

    console.log(this); // Window
    
    function 함수(){
    	console.log(this); 
    }
    
    함수(); // Window
    
</script>

 

** use strict **

<script>
    'use strict';

    console.log(this); // Window
    
    function 함수(){
    	console.log(this); 
    }
    
    함수(); // undefined
    
</script>

 

 

2. object 자료형 안의 함수에서 this값은 오브젝트 그 자체

<script>
    
    var 오브젝트 = {
        data: "kim",
        함수: function(){
            console.log(this);
        }
    }
    
    오브젝트.함수(); // { data : 'Kim', 함수 : f }
    
</script>

this값: 오브젝트 객체

 

<script>
    
    var 오브젝트2 = {
        data: {
          함수: function(){
              console.log(this);
          }
        }
    }
    
    오브젝트2.data.함수(); // { 함수 : f }
    
</script>

this값: data 객체

 

 

* window 객체

<script>

  (1)
  function 함수(){
    console.log(this)
  }

  (2)
  window.함수 = function(){
      console.log(this);
  }; <!-- window라는 오브젝트에 함수 자료를 추가 -->
  
  <!-- (2)와 같은 의미
  var window = {
    함수: function(){
      console.log(this);
    }
  }
  실질적으로 window로 객체 변수를 선언하면 에러 남-->
  
</script>

- 2번의 뜻은 1번의 뜻과 상통한다. script라는 태그 자체안에 window라는 큰 객체(object)가 있는것이다.

 

 

3. constructor(생성자) 안에서 쓰면 constructor로 새로 생성되는 오브젝트

<script>
       
    function 생성자(){
        console.log(this);
    }        

    new 생성자(); // 생성자 {}
        
</script>

this 값: 생성자 객체

 

 

<script>

    function 생성자or함수(){
        this.테스트 = "test";
        console.log(this);
    }        

    // 1번의 경우
    new 생성자or함수(); // 생성자or함수 {테스트: kim}
    
    // 3번의 경우
    생성자or함수(); // Window
    
</script>

- 함수로 사용 했을시엔 window 객체를 가리키지만 new를 통해 생성자(constructor)로 만들게 되면 해당 function의 이름으로 새로운 object 객체를 만든다.

 

 

4. eventListener 안에서 쓰는 this는 e.currentTarget

<script>

	document.getElementById('ID').addEventListener('click', function(e){
            // == e.currentTarget
            console.log(this); // document.getElementById('ID')            
	});
    
</script>

- 이벤트리스너 안에서의 this는 지금 이벤트가 동작하는 곳을 의미하며, e.currentTarget과 document.getElementById('ID')와 같은 의미이다.

 

 

** 가장 가까이 있는 함수에 따라 바뀌는 this

<script>

    document.getElementById('버튼').addEventListener('click', function(e){
        console.log(this); // document.getElementById('버튼') (4)
        var 어레이 = [1,2,3];
        어레이.forEach(function(){
            console.log(this); // window, window, window (1)
        });
    });

    var 오브젝트 = {
        이름들 : ['김', '이', '박'],
        함수 : function(){
            console.log(this); // 오브젝트 { 이름들: ['김', '이', '박'] } (2)
            오브젝트.이름들.forEach(function(){
                console.log(this); // window, window, window (1)
            });
        }
    }
    
    console.log(오브젝트.함수());
</script>

 

 

** function()과 arrow함수의 차이

<script>

    var 오브젝트 = {
        이름들 : ['김', '이', '박'],
        함수 : function(){
            console.log(this); // 오브젝트 { 이름들: ['김', '이', '박'] } (2)
            오브젝트.이름들.forEach(function(){
                console.log(this); // window, window, window (1)
            });
        }
    }

    console.log(오브젝트.함수());
    
    var 오브젝트2 = {
        이름들 : ['김', '이', '박'],
        함수 : function(){
            console.log(this); // 오브젝트 { 이름들: ['김', '이', '박'] } (2)
            오브젝트2.이름들.forEach( () => {
                console.log(this); // 오브젝트 { 이름들: ['김', '이', '박'] } (2)
            });
        }
    }
    
    console.log(오브젝트2.함수());

</script>

ES6에선 function(){} 대신 () => {} 라는 arrow function 문법이 있는데, 둘의 차이는 함수 내부의 this 값을 새로 바꿔주지 않기 때문에(=바깥에 있던 this값을 내부에서 그대로 사용) this를 사용하기 유용하다.

 

 

 

Arrow function
<script>

    var x = function(){} // 기존 함수
    
    var y = () => {} // arrow 함수

</script>

 

 

* 사용법

<script>

    var 두배만들기 = (x) => { return x * 2 }
    console.log( 두배만들기(4) );
    
    
    var 두배만들기 = x => x * 2 ;
    console.log( 두배만들기(8) );

</script>

- 파라미터가 하나면 중괄호 생략이 가능하고 return 값도 한 줄이면 중괄호와 return도 생략 가능하다.

 

 

* arrow function에서의 this

<script>

    var 오브젝트1 = {
        함수 : function(){ 
            console.log(this)
        }
    }

    오브젝트1.함수(); // { 오브젝트1: 함수f }
    
    
    var 오브젝트1 = {
        함수 : () => { console.log(this) }
    }

    오브젝트1.함수(); // window

</script>

arrow function은 외부에 있던 this를 그대로 내부로 가져와서 사용한다.

 

 

 

 

 

var, let, const

* var

  • 재선언 (o)
  • 재할당 (o)
  • 범위: function
var 이름 = 'kim';

이름 = 'lee' // (o)
var 이름 = 'kim'; // (o)

function(){
    var 테스트 = 'test';
    테스트 // (o)
}

테스트 // (x)

 

 

* let

  • 재선언 (x)
  • 재할당 (o)
  • 범위: {}
let 이름 = 'kim';

이름 = 'lee' // (o)
let 이름 = 'kim'; // (x)

if(1 == 1){
    let 테스트 = 'test';
    테스트 // (o)
}

테스트 // (x)

 

 

* const

  • 재선언 (x)
  • 재할당 (x)
  • 범위: {}
const 이름 = 'kim';

이름 = 'lee' // (x)
const 이름 = 'kim'; // (x)

if(1 == 1){
    const 테스트 = 'test';
    테스트 // (o)
}

테스트 // (x)

 

const 오브젝트 = { 이름 : 'Kim' }
오브젝트.이름 = 'Park'; //가능

const 변수를 쓴다고 하더라도 const로 선언된 변수의 자료 형이 object 형이라면 안에 있는 값을 변경 할 수 있다. 변경 불가능한 값을 만드려면 Object.freeze()라는 기본 함수를 사용하면 된다.

 

 

 

호이스팅, 클로저

- 호이스팅

<script>

    // var 이름;

    console.log(이름); // undefined

    var 이름 = 'Kim'; // 이름 = 'kim;
    
    console.log(이름); // kim
    
</script>

var 변수를 사용하게되면 (var 변수) 선언 부분은 맨 위로 올리고 (변수 = 값)만 그 자리에 남게되는데 이런것을 호이스팅이라고 한다. (함수 또한 호이스팅 가능하다.)

 

 

- 클로저

var 나이 = 20;

function 함수(){
  console.log(나이)
}

함수();

클로저는 바깥에 있는 변수는 안쪽에서 자유롭게 사용할 수 있다는 것을 의미한다. 이것을 참조가능하다라고도 한다. 함수 안쪽에 나이라는 변수가 있다면 그것을 사용하겠지만 없으면 바깥에 있는 변수를 사용한다.

 

 

 

Template literals

따옴표 대신 backquote, backtick 이라는 '`' 기호를 사용하여 문자를 만드는 법이다.

: 장점

  • 문자 중간 엔터키 입력가능
  • 문자 중간 변수를 집어넣을 때 편리
var 문자 = `안녕

하세요`;
var 이름 = '손흥민';
var 문자 = `안녕하세요 ${이름} 입니다`;

 

 

* Tagged Literals

 - 문자 해체분석

var 변수 = '손흥민';

function 해체분석기(문자들, 변수들){
  console.log(문자들);
  console.log(변수들);
}

해체분석기`안녕하세요 ${변수} 입니다`; // () 대신에 이런식으로 사용 가능하다.
// 문자열 값: [안녕하세요, 입니다]
// 변수 값: 손흥민

 

 

 

spread operator

- 괄호를 제거해주는 연산자 (함수/소괄호, 오브젝트/중괄호, 어레이/대괄호에서 사용)

var 어레이 = ['hello', 'world'];
console.log(어레이); // ['hello', 'world']
console.log(...어레이); // hello world

 

- 문자의 경우

var 문자 = 'hello';
console.log(문자[0]); // h
console.log(문자[1]); // e
console.log(문자); // hello
console.log(...문자); // h e l l o

 

 

* 합치기 / 복사

// Array
var a = [1,2,3];
var b = [4,5];
var c = [...a, ...b]; // [1, 2, 3, 4, 5]

// Object
var o1 = { a : 1, b : 2 };
var o2 = { c : 3, ...o1 }; // { a: 1, b: 2, c: 3}

: 합치기

 

var a = [1,2,3];
var b = a;

console.log(a);
console.log(b);

var object1 = {a: 1, b: 2};
var object2 = object1;

console.log(object1);
console.log(object2);

: 복사

등호(=)를 이용하여 쉽게 Array와 Object의 값을 복사 할 수는 있지만 참조 값 타입의 변수를 등호(=) 방식으로 복사 하게되면 값 공유가 일어난다. 때문에 복사되어진 값과 복사한 값의 값 변경이 같이 일어나기 때문에 올바른 복사 방식은 아니다.

 

var a = [1,2,3];
var b = [...a];

console.log(a);
console.log(b);

var object1 = {a: 1, b: 2};
var object2 = {...object1};

console.log(object1);
console.log(object2);

: spread를 통한 복사 방식

값 변경이 일어나도 서로의 값에 영향을 주지 않는다.

 

 

* 만약 spread를 통한 복사를 했을 때, 중복되는 값이 있다면 ??

var o1 = { a : 1, b : 2};
var o2 = { a : 3, ...o1 };
console.log(o2); // {a: 1, b: 2}

중복된 값이 있다면 기존의 값에 새롭게 들어온 값으로 저장된다.

 

 

 

apply, call

array를 파라미터 형태로 집어넣고 싶을 때 사용한다.

function 더하기(a,b,c){
   console.log(a + b + c)
}

더하기(1,2,3); // 6

var 어레이 = [10, 20, 30];

더하기(어레이[0], 어레이[1], 어레이[2]); // 60 주먹구구
더하기.apply(undefined, 어레이); // 60 옛날방식
더하기(...어레이); // 60 요즘방식

 

var person = {
    인사 : function(){
      console.log(this.name + '안녕')
    }
}
  
var person2 = {
    name : '손흥민'
}

person.인사.apply(person2);
person.인사.call(person2);

어떤 함수(person)를 실행하는데 다른 오브젝트(person2)에다가 적용해서 실행할 때 사용한다.

 

person.인사.apply(person2, [1,2,3]); // array 형태
person.인사.call(person2, 1,2,3); // 일반 형태

apply와 call의 사용법과 결과는 똑같지만 함수에 파라미터를 넣어서 실행할 때, apply는 array[] 형태로, call은 일반 함수처럼 파라미터를 전달한다.

 

 

 

 

 

'JavaScript' 카테고리의 다른 글

[JavaScript] 함수형 프로그래밍 (일급함수, 고차함수)  (0) 2022.03.29
[JavaScript] ES6 chap.3  (0) 2021.12.02
[JavaScript] ES6 chap.2  (0) 2021.11.30
[JavaScript] Chap.2  (0) 2021.11.25
[JavaScript] Chap.1  (0) 2021.11.19

[JavaScript] Chap.2

 

 

 

반복문

- 단순 for문 사용

var = 사이즈 = [26,28,30,32,34,36];

for (var i = 0; i < 사이즈.length; i++) {
  var 템플릿 = `<option>${사이즈.[i]}</option>`;
  $('#option2').append(템플릿);
}

 

 

- foreach문 사용

var = 사이즈 = [26,28,30,32,34,36];

사이즈.forEach(function(i){
    // 6번 반복 해줌
    // i 값은 사이즈 안에있는 하나하나의 데이터
    var 템플릿 = `<option>${i}</option>`;
    $('#option2').append(템플릿);
});

 

 

 

sort, filter, map

- sort()

* 기본 sort()는 ㄱ,ㄴ,ㄷ / a,b,c 순으로의 정렬이다.

var arr = [7,3,5,2,40];
arr.sort(function(a,b){
  return a - b // 오름차순 정렬
});

a는 배열의 0번 인덱스, b는 배열의 1번 인덱스 순으로 a와 b가 차례로 (0, 1), (1,2), (2,3).... 순으로 비교하여 양수(+)를 return하면 a를 오른쪽, b를 왼쪽으로 보내고 음수(-)를 return하면 a를 왼쪽, b를 오른쪽으로 보낸다.

** sort() 함수는 기존에 사용한 배열 자체를 변환시킨다. (filter, map은 새로운 배열 만듬)

 

 

- filter()

* 자료에서 원하는 부분만 거를 때 사용한다.

var arr = [7,3,5,2,40];
var newArr = arr.filter(function(a){
  return a < 4 // 4 이하인 것만 남김
})

// newArr = [2, 3]

** filter() 함수는 원본 배열을 수정하지 않아서 새로운 변수에 담아서 사용해야한다.

 

 

- map()

* 자료들에 똑같은 작업을 할 때 사용한다.

var arr = [7,3,5,2,40];
var newArr = arr.map(function(a){
  return a * 2 // 모든 배열에 x2를 한다.
})

// newArr = [14, 6, 10, 4, 80]

** filter() 함수는 원본 배열을 수정하지 않아서 새로운 변수에 담아서 사용해야한다.

 

 

 

DOM (Document Object Model)

자바스크립트는 HTML문서를 해석할 때, 자바스크립트가 해석할 수 잇는 문법으로 정리를 하는데 Object나 Array형의 자료형에 담아서 정리한다. 때문에 어떤 태그를 찾을 때 document.queryselector('태그') 등의 형식으로 찾을 수 있다. 이런 것을 document object model = DOM이라고 한다.

 

 

HTML문서 안에서의 모든 구문은 위에서 아래로 순차적으로 해석을 하게된다. 하여

<script>
  document.getElementById('test').innerHTML = '안녕'
</script>

<p id="test">임시글자</p>

이런식으로 사용하면 에러가 난다. 이유는 ? (<p>태그가 존재하기 전에 미리 자바스크립트에서 <p>태그를 찾았기 때문에 없다고 나옴)

 

그럼 해결은 ??

 

<!Doctype>
<html>
<head>
</head>
<body>

<p id="test">임시글자</p>

<script>
  document.getElementById('test').innerHTML = '안녕'
</script>
<script>...</script>
<script>...</script>
<script>...</script>
</body>
</html>

이런식으로 자바스크립트 부분을 body태그 끝나기 직전에 전부 작성하면 위와 같은 에러는 발생하지 않는다.

 

하지만 이 방법 말고도 또 다른 방법이 있다.

 

 

 

 

 

이벤트리스너 ready, load

* ready

- HTML을 다 읽어 들였는지 알려주는 이벤트 리스너가 있다. HTML문서를 먼저 다 읽고난 후에 자바스크립트를 실행 하고 싶을 때 사용한다.

// javascript
document.addEventListener('DOMContentLoaded', function() { // IE9이상 적용
  //DOM생성이 완료되었을 때 실행할 코드 
});

// jquery
$(document).ready(function(){
  //$(document)에 있는 HTML을 다 읽었을 때 실행할 코드 
});

 

 

 

* load

- load라는 이벤트리스너를 사용하면 DOM 뿐만이 아니라 이미지, CSS, JS파일이 로드 됐는지도 확인 할 수 있다. ( * ready는 DOM 생성만 체크, load는 모든 파일과 이미지의 로드상태 체크)

// javascript
document.addEventListener('load', function() {
  //이미지가 다 로드가 되었을 경우 실행할 코드 
});

// jquery
$(document).on('load', function(){
  //이미지가 다 로드가 되었을 경우 실행할 코드 
});

 

 

** 주의

$('').load(function(){

});

이런 형태와 같은 load 함수는 jquery 3버전 이상부터는 다른 함수로 사용되기 때문에 완전 다른 함수. (Ajax 용으로 쓰인다.)

 

 

 

AJAX & JSON

* AJAX

서버와의 통신을 비동기로 처리할 수 있게 해주는 것. (GET, POST, PUT, PATCH, DELETE)

$('.btn').on('click', function(){
	$.ajax({
    	url: "url",
    	type: 'GET'
    	}).done(function(data){
    	console.log(data);
    	
    	}).fail(function(error){
    
        }).always(function(){
});

 

 

새로고침 없이 데이터 전달 가능.

 

 

* JSON

자바스크립트에선 자료를 Object나 Array 형식으로 관리를 하는데, 서버에서 데이터를 전달 할 때, Object와 유사한 JSON이라는 것을 사용한다. JSON은 Object와 비슷하지만 key값에 쌍따옴표를 쳐서 전달한다. 이유는, 데이터를 통신할 때 텍스트 형식이 아니라면 데이터가 중간에 깨질 수 있기 때문...!

{
  "key": "value", 
  "data": "data", 
  "object": "object", 
  "url": "https://www.naver.com",
  "number": 24200
}

 

하지만, 여기선 문제가 있다.

 

JSON은 Object처럼 '.'을 통해서 원하는 자료를 꺼낼 수 없다.

 

그렇기 때문에 변환 작업이 필요하다.

JSON.parse(JSON 데이터)

해당 함수 안에 담긴 데이터는 쌍따옴표가 제거된다.

 

JSON.stringify(여러분의 오브젝트데이터)

반대로, 해당 함수 안에 담긴 데이터는 Object 자료형에 따옴표를 쳐서 JSON 데이터가 된다.

 

 

 

Hammer.js 이미지 슬라이드

터치해서 이동하는 이미지 슬라이드를 바닐라 자바스크립트로 구현하지 않는 이유

  • 이미지에 touch에 관련된 이벤트리스너를 각각 만들어야 함.
  • 터치 시 X축 좌표를 저장
  • 터시 시작과 끝의 좌표를 연산하여 양수면 오른쪽 음수면 왼쪽 이런식으로 판단
  • 등등

호환성 잡기 또한 매우 귀찮다. (안드로이드, ios 버전 마다 다 다름)

 

 

* Hammer.js

<script src="https://cdnjs.cloudflare.com/ajax/libs/hammer.js/2.0.8/hammer.min.js" integrity="sha256-eVNjHw5UeU0jUqPPpZHAkU1z4U+QFBBY488WvueTm88=" crossorigin="anonymous"></script>

라이브러리 추가한다.

 

- 처음 도입부

var image = document.querySelectorAll('.slide-box img')[0];
    
var manager = new Hammer.Manager(image);
manager.add(new Hammer.Pan({ threshold: 0 })); // 이벤트가 발동되기 전까지의 값
    
manager.on('pan', function(e){
  //image가 pan 되었을 때 실행할 코드 (터치 후 슬라이드 하는 것, rotate 등 여러가지 있음)
})

 

- 실행부

manager.on('pan', function(e){
  console.log(e.deltaX) // x 축으로 드래그한 거리
  
  if ( e.deltaX < -1 ){ // 왼쪽으로 드래그 (오른쪽 사진을 볼 때)
      $('.slide-container').css('transform', 'translateX('+ e.deltaX +'px)');      
      if (e.isFinal) { //터치가 끝났을 때
        console.log(e.isFinal)
      }
    }
})

 

 

 

Typewriting (setTimeout)
setTimeout(function(){ 실행할 코드 }, 1000)

 

<div>
    <button>버튼</button>
    <h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Magnam praesentium, voluptate iusto sint atque officiis maxime vel id molestiae velit ullam deleniti ad, vero libero maiores tempora, quasi aspernatur voluptas.</h1>
</div>

<script>

    var h1태그 = document.querySelector('h1');
    var 원래글씨 = document.querySelector('h1').innerHTML;

    $('button').click(function(){
    	애니메이션(h1태그, 원래글씨);
    })

    function 애니메이션(h1태그, 원래글씨){
        h1태그.innerHTML = '';
        for(let i=0; i<원래글씨.length; i++){
            setTimeout(function(){                
                h1태그.innerHTML += 원래글씨[i];
            }, (100 * i));            
        }
    }

    </script>

 

 

** 유의

한글처럼 IME입력기를 사용해 타이핑하는 언어를 위해 타이핑 애니메이션을 구현하는 라이브러리도 있으니 그것을 이용하길 권장

 

 

 

canvas

이미지처럼 만들어서 사용할 수 있음.

<canvas id="canvas"></canvas>
var canvas = document.getElementById('canvas'); // 캔버스 그리기
var c = canvas.getContext('2d'); // 캔버스 작업하기
ctx.fillText('영수증', 10, 20); // 캔버스 안에 글쓰기

 

 

 

'JavaScript' 카테고리의 다른 글

[JavaScript] 함수형 프로그래밍 (일급함수, 고차함수)  (0) 2022.03.29
[JavaScript] ES6 chap.3  (0) 2021.12.02
[JavaScript] ES6 chap.2  (0) 2021.11.30
[JavaScript] ES6 chap.1  (0) 2021.11.29
[JavaScript] Chap.1  (0) 2021.11.19

[JavaScript] Chap.1

 

 

변수
// 범위가 function-scope
var 나이 = 20;
var 나이 = 21; // O
나이 = 22; // O

// 범위가 {} block-scope
// 재 선언이 불가능한 변수를 만들 때
let 나이 = 20;
let 나이; // X
나이 = 21; // O

// 범위가 {} block-scope
// 재 선언이 불가능한 변수를 만들 때
// 재 할당이 불가능한 변수를 만들 때
const 나이 = 20;
const 나이; // X
나이 = 21; // X

 

 

 

JQuery animate
$('.box').animate({ marginLeft : '100px', 1000 }); // css속성, 밀리초

 

 

 

정규식

정규식 사용: /텍스트/

/abc/
// 정규식.test('테스트 할 문자')
/abc/.test('abcdef')
/[A-z]/ // 대문자 A부터 소문자 z까지
/[ㄱ-ㅎ]/ // ㄱ부터 ㅎ까지
/\S/ // 모든 문자
/\S+/ // 모든 문자열

 

 

 

Carousel(이미지 슬라이드)
<div style="overflow: hidden">
  <div class="slide-container">
    <div class="slide-box">
      <img src="img/shirt1.jpg">
    </div>
    <div class="slide-box">
      <img src="img/shirt2.jpg">
    </div>
    <div class="slide-box">
      <img src="img/shirt3.jpg">
     </div>
   </div>
 </div>
    
<button class="slide-1">1</button>
<button class="slide-2">2</button>
<button class="slide-3">3</button>
.slide-box {
  width: 100vw;
  float: left;
}
.slide-container {
  width: 300vw; /* %로 대체가능 */
}
.slide-box img {
  width: 100%;
}

 

 

 

 

 

스크롤
//javascript
window.addEventListener('scroll', function(){

});

//jquery
$(window).on('scroll',function(){
  
});

// Window 대신 Document도 가능 !

- 스크롤 움직일시 이벤트

 

 

// javascript
window.scrollY;

// jquery
$(window).scrollTop();

- 현재 화면에서 세로(Y) 스크롤 위치 좌표찾기

 

 

 

반복문에서 var와 let의 기능 차이

반복문 안에서 이벤트 리스너가 존재할 시, 이벤트 리스너는 이벤트 리스너의 이벤트가 발생 했을 시 실행되기 때문에 반복문이 다 돌아지고 난 후에 이벤트 리스너에서 이벤트를 실행한다. 반복문에서 정의된 변수 i의 값을 var로 정의 했을 시 var의 범위가 반복문 이상이기 때문에 이미 i의 값은 반복문이 완료 되었을 때의 값으로 할당되어 있고, let의 경우는 i는 반복문 내에서 다른 코드가 참조할 수 있는 범위를 가지기 때문에 이벤트 리스너에서 i의 값을 찾을 때, 반복문의 범위 만큼 돌았을 때의 값을 참조할 수 있다.

(그냥 let을 사용하는걸로 하자)

 

 

 

이벤트 버블링과 이벤트 함수

- 어떤 HTML 태그에 이벤트가 발생하면 그의 모든 상위요소까지 이벤트가 실행되는 현상

<div>
  <div>
    <p>안녕</p>
  </div>
</div>

p 태그를 클릭하면 p와 상위 div, div가 전부 클릭 되었다고 인지함.

 

 

$('div').click(function(e){
  e.target; // 지금 실제로 클릭한 요소
  
  e.currentTarget; // 지금 이벤트리스너가 달린 곳
  $(this); // == e.currentTarget (jquery)
  this // == e.currentTarget (javascript)
  
  e.preventDefault(); // 기본동작 막기
  e.stopPropagation(); // 내 상위 요소의 이벤트 버블링 막기
});

 

** 주의 **

e.target과 비교시 e.currentTarget과 this는 비교가 잘 되지만 $(this)는 비교가 잘 안된다. 의미는 맞지만 javascript와 jquery의 형식이 다르기 때문이다. 비슷하게 e.target과 document.querySelector.... 이런식으로 찾아낸 요소는 비교가 가능하다. (그러므로 javascript는 javascript끼리 jquery는 jquery끼리 비교하자)

 

 

 

이벤트 버블링과 dataset
<div class="test">
  <ul class="list"> <!-- 이벤트리스너 위치 -->
    <li class="tab-button">Products</li> <!-- e.target 범위 -->
    <li class="tab-button active">Information</li> <!-- e.target 범위 -->
    <li class="tab-button">Shipping</li> <!-- e.target 범위 -->
  </ul>
</div>

 

 

* dataset

// javascript
// 셀렉터.dataset.작명
// HTML 태그의 요소와 속성에 (data-작명="") 식으로 작성
document.querySelector('요소').dataset.작명

// jquery
// $(HTML요소).data(키, 값) -> set
// $(HTML요소).data(키) -> get
$(document).data('id', 'test')
$(document).data('id')

- 개발자만 볼 수 있는 HTML 요소와 속성으로 값을 부여하여 사용할 수 있음.

 

 

<ul class="list">
  <li class="tab-button" data-id="0">Products</li>
  <li class="tab-button active" data-id="1">Information</li>
  <li class="tab-button" data-id="2">Shipping</li>
</ul>
$('.list').click(function(e){
    open(e.target.dataset.id);
});

 

 

 

 

'JavaScript' 카테고리의 다른 글

[JavaScript] 함수형 프로그래밍 (일급함수, 고차함수)  (0) 2022.03.29
[JavaScript] ES6 chap.3  (0) 2021.12.02
[JavaScript] ES6 chap.2  (0) 2021.11.30
[JavaScript] ES6 chap.1  (0) 2021.11.29
[JavaScript] Chap.2  (0) 2021.11.25

+ Recent posts