<목차>

1. 이벤트 바인딩이란?

2. 이벤트 버블링, 이벤트 캡쳐

3. 동적 이벤트 바인딩이란?

4. JavaScript로 이벤트 동적 바인딩하기.

5. jQuery로 이벤트 동적 바인딩하기.

 

 

 

 

1. 이벤트 바인딩이란?

 

  1-1. 이벤트 바인딩

 

   동적 바인딩에 대한 내용을 정리하기 전에, 가장 먼저 이해해야 할 것이 이벤트 바인딩 입니다. JS코드와 jQuery코드

   는 대부분 이벤트(event)에 의해 동작합니다. 이벤트란 대표적으로 클릭, 키보드 입력 등 사용자의 어떤 행위를 의미

   합니다.

 

   이러한 이벤트 바인딩(Event Binding)은 아래와 같은 과정으로 이루어 집니다.

   

        1. 이벤트를 받아 줄 요소를 선택합니다.

        2. 선택한 요소가 어떤 이벤트에 반응할지, 즉 요소와 이벤트를 연결해주는 바인딩을 합니다.

        3. 이벤트가 발생했을 때 실행될 코드를 작성합니다.

 

   역시 글만 읽으면 이해가 잘 되지 않을 수 있습니다. 아래에서 JS와 jQuery를 이용한 이벤트 바인딩에 대해서 설명드

   리겠습니다. :)

 

   ※ JS를 사용한 이벤트 바인딩

 

      - HTML 이벤트 핸들러

        DOM요소의 onclick속성에 JS함수를 호출하여 바인딩하는 방법입니다.

 

<소스>

<html>
    <body>
        <div class="root" id="root">
            <div class="parent" id="parent">
                <div class="child" id="child">
                    <div class="target" id="target" onclick="targetFunction();">Target</div>
                </div>
            </div>
        </div>
    </body>
</html>
function targetFunction() {
    alert('Target');
}

        해당 버튼을 클릭하면 작성 해놓은 targetFunction()함수가 실행되어 alert로 'Target' 텍스트가 나타날 것입니다.

        그런데HTML과 JS코드는 분리시켜 관리하는 것을 권장하기 때문에 이 방식은 좋은 방식이 아닙니다.

 

 

      - DOM 이벤트 핸들러

        DOM요소에 이벤트를 바인딩하고 이벤트가 발생하면 실행될 코드를 함수로 작성하는 방법입니다.

 

<소스>

<html>
    <body>
        <div class="root" id="root">
            <div class="parent" id="parent">
                <div class="child" id="child">
                    <div class="target" id="target">Target</div>
                </div>
            </div>
        </div>
    </body>
</html>
var target = document.getElementById('target');

target.onclick = function(e) {
    alert('target');
}

        여기서 "on이벤트 이름"이란 JS이벤트 명에 on을 붙인 것입니다.

        예를 들어, click이벤트를 바인딩 하려면 onclick가 되겠고, blur 이벤트를 바인딩 하려면 onblur가 될 것입니다.

 

        위 방식도 그렇게 권장되는 방식은 아닙니다.

 

 

      - DOM 이벤트 리스너

        DOM요소에 addEventListener메서드를 호출하여 이벤트를 바인딩하고, 수행할 함수를 작성합니다.

 

<소스>

<html>
    <body>
        <div class="root" id="root">
            <div class="parent" id="parent">
                <div class="child" id="child">
                    <div class="target" id="target">Target</div>
                </div>
            </div>
        </div>
    </body>
</html>
var target = document.getElementById('target');

target.addEventListener("click", function() {
	alert("target");
});

        해당 방식이 바닐라JS기준으로 가장 많이 사용되는 방식입니다.

        "DOM 이벤트 핸들러"방식과는 달리 "이벤트 이름"에는 원래 JS이벤트명(ex. onclick => click)을 작성하면 됩니다.

 

   ※ jQuery를 사용한 이벤트 바인딩

 

      - DOM 이벤트 핸들러

        DOM요소에 이벤트를 바인딩하고 이벤트가 발생하면 실행될 코드를 함수로 작성하는 방법입니다.

 

<소스>

<html>
    <body>
        <div class="root" id="root">
            <div class="parent" id="parent">
                <div class="child" id="child">
                    <div class="target" id="target">Target</div>
                </div>
            </div>
        </div>
    </body>
</html>
$('#target').on('click', function() {
	alert("target");
});

        JS에서 했던것과 마찬가지로 id가 target인 DOM요소를 찾아서 'click'이벤트를 실행합니다.

 

 

2. 이벤트 버블링, 이벤트 캡쳐

 

  2-1. 이벤트 버블링

 

     이벤트 버블링은 특정 화면 요소에서 이벤트가 발생했을 때 해당 이벤트가 더 상위의 화면 요소들로 전달되어가는

     특성을 의미합니다. 아래와 같은 그림처럼 작동합니다.

     아래 그림은 이벤트 버블링에 대한 설명을 아주 잘 하고있습니다.     

   

(1-1)Event Bubbling

     위 그림은 이벤트 버블링(Event Bubbling)에 대해 설명한 그림입니다.

 

(1-2)Event 흐름을 학습하기 위한 Image

     이벤트 흐름을 학습하기 위해 "(1-2)Event 흐름을 학습하기 위한 Image"를 예제로 설명을 이어나가겠습니다.

     (각 클래스에 이벤트가 바인딩 되어있다고 가정합니다.)

 

     (1) target 클래스를 클릭했을 경우

         이벤트 흐름이 가장 깊은 깊이의 노드(자식 노드)에서 가장 얕은 깊이의 노드(부모 노드)로 향합니다.

         이벤트 흐름으로는 target ▶ child ▶ parent ▶ root ▶ body ▶ html 순서로 이어집니다. 

 

     (2) child 클래스를 클릭했을 경우

        이벤트 흐름으로는 child ▶ parent ▶ root ▶ body ▶ html 로 이어집니다.


     (3) parent 클래스를 클릭했을 경우

        이벤트 흐름으로는 parent ▶ root ▶ body ▶ html 로 이어집니다.

 

     (3) root 클래스를 클릭했을 경우

        이벤트 흐름으로는 root ▶ body ▶ html 로 이어집니다.

 

 

  2-2. 이벤트 캡쳐링

 

     이벤트 캡쳐링은 특정 화면 요소(선택된 Element)에서 이벤트가 발생했을 때 해당 이벤트가 특정 화면 요소(선택된

     Element)까지 아래로 이동하면서 이벤트를 발생시킵니다.

 

(2-1)Event Capturing

위 그림은 이벤트 캡쳐링(Event Capturing)에 대해 설명한 그림입니다.

 

(2-2)Event 흐름을 학습하기 위한 Image

     이벤트 흐름을 학습하기 위해 "(2-2)Event 흐름을 학습하기 위한 Image"를 예제로 설명을 이어나가겠습니다.

     (각 클래스에 이벤트가 바인딩 되어있다고 가정합니다.)

 

     (1) target 클래스를 클릭했을 경우

         이벤트 흐름이 가장 깊은 깊이의 노드(자식 노드)에서 가장 얕은 깊이의 노드(부모 노드)로 향합니다.

         이벤트 흐름으로는 html ▶ body ▶ root ▶ parent ▶ child ▶ target 순서로 이어집니다. 

 

     (2) child 클래스를 클릭했을 경우

        이벤트 흐름으로는 html ▶ body ▶ root ▶ parent ▶ child 로 이어집니다.


     (3) parent 클래스를 클릭했을 경우

        이벤트 흐름으로는 html ▶ body ▶ root ▶ parent 로 이어집니다.

 

     (3) root 클래스를 클릭했을 경우

        이벤트 흐름으로는 html ▶ body ▶ root 로 이어집니다.

 

 

 

     ※ 이벤트 버블링 및 이벤트 캡쳐링 예제

   

        아래 링크에서 이벤트 버블링 및 캡쳐링을 바로 확인할 수 있습니다.

        addEventListener() 함수의 3번째 인자의 값에 따라 버블링 및 캡쳐를 설정할 수 있습니다.

    

        - False : Event Bubbling

        - True : Event Capturing

 

        https://codepen.io/mygumi/pen/vjywaB

 

 

3. 동적 이벤트 바인딩이란?

    동적 이벤트 바인딩이란, 동적으로 생성된 Element에 이벤트를 바인딩 한다는 말입니다. 간단한 예로, Ajax를 사용해

    서 페이지 새로고침 없이 Element를 추가 할 경우(jQuery의 append함수 참고), 어떻게 이벤트를 바인딩 할까요? 

    이미 페이지가 로드되면서 개발자가 작성한 JS는 전부 이벤트가 바인딩 된 상태일 겁니다. 그러나, 동적으로 Element

    를 생성해서 추가한다면 이벤트 버블링을 이용하여 동적으로 생성된 객체에 이벤트를 바인딩 할 수 있습니다.

 

    간단한 예시를 들어보겠습니다.

 

   

(3-1) 동적 Element가 추가되기 전

 

<소스>

<html>
  <body>
    <div class="root">
         
    </div>
    <button class="btn" name="btn">Element 동적 추가</btton>
  </body>
</html>
document.querySelector('.root').addEventListener('click', function(e) {
  alert("root");
  alert(e.target);
});


document.querySelector('.btn').addEventListener('click', function(e) {
  var div = document.createElement('div');
  div.className = 'row';
  
  div.innerHTML = '<h2 class="parent"><button class="child"><span class="target">Target</span></button></h2>';
  
  document.querySelector('.root').appendChild(div);
});
.btn{ 
  margin-top:320px;
}
/* .btn style 추가 */

   소스코드 구성이 위와같다면, Element 동적 추가 버튼을 클릭하면 새로운 Element들이 <div class="root"> 아래로 생

   성될 것 입니다.

 

(3-2) 동적 Element가 추가된 후

 

   이제부터 위와 같이 동적으로 생성된 Element를 이벤트 버블링으로 어떻게 접근하는지 JavaScript와 jQuery를 사용하

   여 알아보겠습니다. !

 

4. JavaScript로 이벤트 동적 바인딩하기.

    JavaScript로 이벤트 동적 바인딩하는 방식은 바로 위, 3. 동적 이벤트 바인딩이란? 에서 이미 보여졌습니다. :) 눈치 채

    신분들도 있으시죠? 위 예제를 그대로 사용해보면 아마 이벤트가 동적으로 바인딩되어, 사용자가 클릭한 위치의

    Element Name이 출력 될 것입니다.

 

    그럼 어떻게 이러한 현상이 나타나는걸까요?

 

   

(4-1) .root Element를 클릭할 경우 이벤트 발생

 

    위 코드에는 document.querySelector('.root').addEventListener('click', function(e) { } ); 함수가 존재합니다.

 

    코드를 하나씩 뜯어보겠습니다.

   

    코드를 풀어서 읽어보면, document객체 아래에 있는 .root 클래스에 대한 click이벤트를 addEventListener함수로 바

    인딩 하겠다는 의미입니다. 즉, .root 클래스 Element를 클릭하면 addEventListener함수가 실행됩니다.

 

    그렇다면, .root 클래스 Element내부에 동적으로 생성된 Element들은 어떻게 이벤트에 바인딩 될까요?

 

    바로, 이벤트 버블링으로 동적으로 생성된 Element를 구분할 수 있습니다.

    아래 예제소스를 보겠습니다.

 

<html>
  <body>
    <div class="root">
         
    </div>
    <button class="btn" name="btn">Element 동적 추가</btton>
  </body>
</html>

<동적으로 Element가 생성되지 않았을 경우>

 

<html>
  <body>
    <div class="root">
      <h2 class="parent">
        <button class="child">
          <span class="target">Target</span>
        </button>
      </h2>
    </div>
    <button class="btn" name="btn">Element 동적 추가</btton>
  </body>
</html>

 

<동적으로 Element가 생성된 경우>

 

    - 동적으로 Element가 생성되었고, target 클래스(span)을 클릭 한 경우

       1. target(span)에서 click 이벤트를 잡지 못하고 child(button)으로 이벤트가 버블링 됩니다.

       2. child(button)에서 click 이벤트를 잡지 못하고 parent(h2)으로 이벤트가 버블링 됩니다.

       3. parent(h2)에서 click 이벤트를 잡지 못하고 root(div)로 이벤트가 버블링 됩니다.

       4. root(div)에서 click 이벤트를 잡아서 아래 소스코드를 실행합니다.(해당 click이벤트는 document까지 버블링 됩

          니다.)

document.querySelector('.root').addEventListener('click', function(e) {
  alert("root");
  alert(e.target);
});

    그럼 함수에 있는 alert("root")와 alert(e.target)가 실행됩니다.

    function(e) { } 인자로 받은 e를 사용하여 e.target을 출력하면 무엇이 나올까요?

    아래 그림과 같은 alert창이 생성됩니다.

 

 

    이벤트는 .root Element에서 받았지만, e.target을 출력하면 사용자가 클릭한 위치의 Element를 알아낼 수 있습니다.

 

    이러한 방식으로 많은 개발자들이 동적으로 생성된 Element를 쉽게 사용할 수 있습니다. : )

 

5. jQuery로 이벤트 동적 바인딩하기.

    4. JavaScript로 이벤트 동적 바인딩하기에서 이미 어떤 방식으로 이벤트 동적 바인딩 하는지 알아봤으니,

    jQuery에서는 간단한 사용법만 알아보겠습니다.

 

    위 예제를 그대로 빌려, 만약 jQuery로 변환한다면 아래와 같은 소스코드가 될 것입니다.

$(document).on('click', '.root', function(e) {
    alert("root");
    alert(e.target);
});

    정말 간단하지 않나요? $(document).on()문법은 정보가 많기때문에 따로 다루지 않겠습니다. ㅎㅎ

    구글링하면 5분내로 실제 사용 가능하니깐요 : )

 

 

 

    혹시라도 지금까지 포스팅된 내용 중 잘못된 부분이 있다면 꼭 말씀 부탁드립니다! 잘못된 내용을 공유하고 싶진 않

    네요 :)

 

 

 

 

Reference

 

JS코드를 작성하다보면, JS객체 또는 JSON에 key값을 동적으로 할당하고 싶을때가 있습니다.

 

JS객체는 key와 value의 쌍으로 이루어져 있으며 따옴표나 쌍따옴표를 사용하여 작성합니다.

 

아래 keyname은 something객체의 key값에 들어갈 동적인 값 입니다.

let keyname = 'Name';
let something = {
   keyname + 'postfix' : 'value'
}

대충 생각해보면 위와 같은 코드는 정상적으로 동작할 것 같습니다. 하지만, 위 코드는 SyntaxError가 발생합니다.

 

value 부분에는 함수나 String을 이어붙여도 자동으로 처리해주고 변수도 사용할 수 있지만 key부분에는 그런 처리가 허

 

용되지 않습니다.

 

그렇다면 어떻게 동적으로 key값을 적용할 수 있을까요?

 

두 가지 방법이 있습니다.

 

1. 객체 생성과 동시에 동적인 key값 설정

let keyname = 'Name';
let something = {
    [keyname + 'postfix'] : 'value'
};

 

2. 객체 생성 후 동적인 key값 설정

let keyname = 'Name';
let something = { };

something[keyname + 'postfix'] = 'value';

위 두가지 방식을 사용하여 동적인 key값을 넣을 수 있습니다.

 

 

Reference

 

JSON 생성시 Key값을 동적으로 할당하기 :: Outsider's Dev Story

JSON은 아주 유용하고 간편한 데이터 스트럭처이고 다들 아시다 시피 아래와 같이 사용합니다.[code javascript]var something = { name: 'Outsider', blog: 'http://blog.outsider.ne.kr'}[/code]키와 값의...

blog.outsider.ne.kr

 

봐도봐도 잊고 까먹는다..

 

그래서 이번에는 정말 간단하게 정리한 문서를 참조하겠습니다.

 

대충 이해하고 넘어간 다음에 나중에 깊게 이해하면 될 것 같습니다.

 

 

간혹 가다가 웹 페이지가 예상대로 돌아가지 않을 떄가 있다.


예를 들면, JQuery를 사용해서 태그를 숨겼는데 그대로 보이는 경우이다.


이는 페이지가 로드되면서 실행되는 순서가 다르기 때문이다.

 

 

 

<html>
    <head>
        <script src="jquery.js" type="text/javascript"></script>
        <script src="abc.js" type="text/javascript"></script>
        <link rel="stylesheets" type="text/css" href="abc.css"></link>
        <style>h2{font-wight:bold;}</style>
        <script>
            $(document).ready(function(){
                $("#img").attr("src", "kkk.png");
            });
        </script>
    </head>
 
    <body>
        <img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
        <script src="kkk.js" type="text/javascript"></script>
    </body>
</html>

 

 

 

 

위와 같은 소스에서 실행 순서는 다음과 같다.


1. HTML 문서 다운로드

2. HTML 문서 파싱 시작

3. HTML 파싱이 3번 라인에 도달

4. jquery.js 가 다운로드 되고 파싱된다.

5. HTML 파싱이 4번 라인에 도달

6. abc.js가 다운로드되고 파싱되고 실행된다.

7. HTML 파싱이 5번 라인에 도달

8. abc.css가 다운로드 되고 파싱된다.

9. HTML 파싱이 6번 라인에 도달

10. <style>태그 내부 CSS 규칙이 파싱되고 정의된다.

11. HTML 파싱이 7번 라인에 도달

12. 내부 Javascript다 파싱되고 실행된다.

13. HTML 파싱이 15번 라인에 도달

14. abc.jpg가 다운로드 되고 보여진다.

15. HTML 파싱이 16번 라인에 도달

16. kkk.js가 다운로드 되고 파싱된 후 실행된다.

17. 페이지 로딩이 끝났으므로 kkk.png그림이 보인다.

18. 끝


* onload함수는 페이지 로딩이 끝나는 이후 바로 실행


* Java, JSLT, HTML, Javascript가 모두 섞여있을 경우, 보기 순서대로 실행된다.

이때, 먼저 실행되는 쪽에서 뒤쪽에서 실행되는 쪽의 값을 읽을 수 없다. 준비가 안됐기 때문.


* 하나의 jsp파일 내에 작성된 소스라 하더라도,

Scriptlet이나 jstl, el 등은 서버단에서 실행되며

Javascript는 브라우저에서 실행되기 때문에 두 언어 간 변수를 직접 주고받을 수 없다.


예를 들어, 다음과 같은 방법으로 직접적으로 변수를 쓸 수 없다. 

 

var list = new Array();
 
list = "${TestList}";
 
alert( list[0].name );

 

 

쓰려면 다음과 같이 해야한다.

var list = new Array(); <c:foreach items="${TestList}" var="item">     list.push("${item.name}"); </c:foreach>

 

 

*Expression Language

${식} 과 같은 방법으로 표현한다.

JSP의 스크립트 요소(스크립틀릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용할 수 있다.

 

 

 

아래글 정말 좋다 꼭 읽어보자

http://blog.devez.net/420

 

[JSP / Servlet] JSP 라이프 사이클(life cycle)과 동작 원리 - Blog Goooood.net

JSP (JavaServer Pages) JSP 파일은 직접 실행되지 못하며 JSP 코드에 해당되는 서블릿을 생성해서 서블릿이 실행되는 방식이다. JSP는 주로 HTML 코드를 응답하기 위한 용도로 사용되며 JSP를 사용하지 않고 서블릿만으도 동일한 기능을 구현할 수 있지만 작성해야 되는 코드가 많다는 단점이 있다. JSP 실행 순서 사용자가 브라우저에서 JSP 주소를 입력했을 때 JSP가 실행되는 순서는 다음가 같다. 브라우저가 웹서버에 요청 정보를 전

blog.devez.net

 

 

 

 

출처 : https://defacto-standard.tistory.com/249

아직 읽어보지 못했지만 꼭 한번 읽어봐야겠습니다.


자바스크립트가 var를 사용하면서 타 언어에 비해 변수의 유효범위가 많이 다릅니다.


왜 var가 아닌 let을 써야하는지 확인해봐야합니다.


https://blog.hanumoka.net/2018/09/21/javascript-20180921-javascript-var-let-const/

시간날때 무조건 읽어봐야하는 글.


좋은 코드를 작성하기 위해 필수인듯


https://engineering.huiseoul.com/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9E%91%EB%8F%99%ED%95%98%EB%8A%94%EA%B0%80-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-4%EA%B0%80%EC%A7%80-%ED%9D%94%ED%95%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98-%EB%8C%80%EC%B2%98%EB%B2%95-5b0d217d788d

이것때문에 많은 시간을 허비한게 생각나네요. 정말 간단하면서도 좋은방법이 있습니다.


자바의 현재 시간을 표시해주는 내부함수를 js파일주소 뒤에 붙여주면 해결됩니다.


예를들어, 아래 코드처럼 js파일을 적용시키면 바로바로 js파일이 적용이 안되거나 전혀 안될때가 있습니다. 


<script src="js/Naver_Map/Map.js"></script>


이러한 오류를 고치기위해 아래와 같은 소스로 변경해주면 됩니다.


<script src="js/Naver_Map/Map.js?t=<%=System.currentTimeMillis() %>"></script>


경로 뒷부분에 ?t=<%System.currentTimeMillis()%> 부분만 추가해주면 됩니다.


http://zzznara2.tistory.com/689



----------------------------------------------------------------------------------------------------------------------------------------------------------------


추가.


js파일뿐만 아니라 css파일역시 바로 적용되지 않을 수 있습니다. 이럴때는 시스템 시간을 변경시키는 방법보다


간단하게 버전을 변경해서 반영하는 방법이 있습니다. 이러한 방법을 적용시키는 방법은


위의 js파일을 예로들면,


<script src="js/Naver_Map/Map.js?var=1"></script>


와 같이 ?var='값' 을 넣어주면 됩니다.


자세한 내용은 아래 링크로 첨부하겠습니다.


http://kanu.tistory.com/30

자바스크립트 뿐만 아니라, 다양한 언어들에 대한 요약정리가 잘 되어있는 것 같습니다.


아직 다 보진 않았지만 공부에 도움이 될만한 것 같아 링크를 남깁니다.


http://tcpschool.com/javascript/js_datatype_basic

+ Recent posts