2010년 3월 17일 수요일

[자바스크립트] 자바스크립트 이벤트 처리

⑴ 이벤트

    ① 이벤트의 역할

        사용자가 무슨 일을 했는지, 또는 페이지가 언제 로드 되었는지와 같은 정보를 제공해주는 것


    ② 이벤트와 객체의 관련성

        동작 중인 브라우저에 구현된 DOM에 가장 큰 영향을 받는 것으로 객체와 가장 밀접한 관계를 가지고 있다.


    ③ 이벤트의 기본 처리 방식

        (X)HTML 객체 태그나 자바스크립트 코드 블록 또는 파일 내에서 이루어진다.


    ④ w3c는 이벤트 개념

        ㉠ 사용자 인터페이스 (마우스 , 키보드)

        ㉡ 논리(처리 결과)

        ㉢ 변경(문서를 수정하는 일)


    ⑤ 이벤트 관련 객체
    

사용자 삽입 이미지


⑵ DOM  레벨 0의 이벤트 핸들러

    - 최초의 이벤트 시스템은 Events 또는 DOM 레벨 0라고 불린다.

    - DOM 레벨 0 이벤트

       현재의 모질라 / 파이어폭스에 해당하는 구 넷스케이프와 IE로 나눈다.

    - 객체 이벤트에 이벤트 핸들러를 통해서 새로운 기능이나 개선된 기능을 추가하는 방식      

    - 이벤트 핸들러

       객체 프로퍼티 중 하나로 구문은 onevent

    - 이벤트 핸들러의 이름은 'on'으로 시작하며 그 뒤에 이벤트명(load,  click 등)이 붙는다.           

    - 객체에 직접 이벤트 핸들러를 추가하는 방법              

       <body onload = 'var i = 23 ; i  *=3 ; alert(i);'> // 이벤트 핸들러 이름을 객체 태그의 속으로 넣는다.

                                                                       // 해당 이벤트가 발생했을 때 실행 할 코드를 지정해주는 것


    - 인라인 모델(inline model) 또는 인라인 등록 모델(inline registration model)

       이벤트를 HTML 엘리먼트의 속성으로 추가하는 방식 , 여러개의 함수를 호출하는 경우는 ;(세미콜론)으로 구분한다.


      <body onload = 'javascript:함수1();함수2()'>        

  

    - 이벤트 핸들러를 객체의 프로퍼티로 취급하여 직접 접근도 가능하다.

       window.onload = 함수객체   // 제거하기 위해서는 null

   

    - 기본 모델(traditional model) 또는 기본 등록  모델(traditional registration model)

       이벤트 핸들러를 객체의 프로퍼티로 취급하여 함수를 배정하는 방식  

       

        function Msg_Event(){
            var strMsg = 'Thank you';
            alert(strMsg);
        }
     
        window.onload = Msg_Event();          
   
       <body onload = 'javascript:Msg_Event();'>


   

    ① 이벤트 객체


       -  IE나 파이어 폭스 공통으로 사용되는 Event 프로퍼티


           ① altKey

               이벤트가 발생한 시점에서의  Alt 키의 눌림 여부


           ② clientX

               클라이언트의 X좌표


           ③ clientY

               클라이언트의 Y좌표


           ④ ctrlKey

               이벤트가 발생한 시점에서 ctrl 키의 눌림 여부


           ⑤ keyCode

               눌린 키의 코드값(숫자)


           ⑥ screenX

               이벤트가 발생한 스크린 X 좌표


           ⑦ screenY

               이벤트가 발생한 스크린 Y 좌표


           ⑧ shiftKey

               이벤트가 발생한 시점에서 shift 키의 눌림 여부


           ⑨ type

               이벤트 종류


           ⑩ fromElement (IE) , relatedTarget(파이어 폭스, 넷스케이프)

               onMouseOver나 onMouseOut 이벤트를 사용할 경우의 마우스 객체                


           ⑪ toElement(IE) , currentTarget(파이어 폭스, 넷스케이프)

               마우스 포인터 위치해 있는 객체 설정 혹은 현재 접근하는 엘리먼트               


           ⑫ scrElement(IE) , target(파이어 폭스, 넷스케이프)

               이벤트를 발생한 객체 설정 혹은 이벤트를 직접 받는 객체


           ⑬ 이벤트 프로퍼티 기타 목록

                  

                 ㉠ bubbles

                     이벤트가 DOM을 통해서 버블링 되었는지의 여부


                 ㉡ button

                     마우스 버튼의 상태(눌림 여부)


                 ㉢ cancelBubble

                     버블링의 취소 여부


                 ㉣ cancelable

                     이벤트의 취소 여부


                 ㉤ detail

                     이벤트의 세부 사항


                 ㉥ eventPhase

                     이벤트의 진행 단계


                 ㉦ isChar

                     이벤트가 문자를 발생시키는지의 여부


                 ㉧ layerX , layerY

                      position 프로퍼티가 absolute인 경우,

                      현재 레이어에서의 상대 x(y) 좌표  


                 ㉨ metaKey

                    메타 키 (ctrl/alt/shift 키) 의 상태 (눌림 여부)                      


                 ㉩ pageY , pageX

                     페이지 내의 상대 x(y) 좌표

                   

                 ㉪ timeStamp

                     이벤트가 발생한 시각


                 ㉫ view

                     이벤트가 생성된 AbstractView ( 무슨 말이지 모르겠네요)


                 ㉬ which

                     눌린 키의 유니코드 값


         - IE 에서는 Event가 window 객체의 프로퍼티로 이벤트가 발생하면 그에 따른 데이터가 프로퍼티에  담긴다.

       

             function mouseDown(){
                 var locStr = 'x = ' + window.event.screenX + ' y = ' + window.event.screenY;
                 alert(locStr);
            }
     
            document.onmousedown = mouseDown;         


         -  파이어 폭스는 nsEvent 이벤트 객체로 이벤트가 발생하여 그에 따른 데이터가 프로퍼티에 담긴다.

     

             function mouseDown(nsEvent){
                  var locStr = 'x = ' + nsEvent.screenX + ' y = ' + nsEvent.screenY;
                  alert(locStr);
             }
     
             document.onmousedown = mouseDown;


        - 크로스 브라우저 코드

           여러 브라우저에서 호환되는 코드 , 즉 DOM 레벨 0 이벤트가 IE와 파이어 폭스(넷스케이프)로 나누어져 있으므로

           자바스크립트 코드를 작성할 코드 호환되도록 작성하는 코드


           function mouseDown(nsEvent){
                var theEvent = nsEvent ? nsEvent : window.event;
                var locStr = 'x = ' + theEvent .screenX + ' y = ' + theEvent .screenY;
                alert(locStr);
           }
     
           document.onmousedown = mouseDown;        

         

    ② 이벤트 버블링(IE) , 이벤트 캡처링(넷스케이프 , 파이어폭스)

        하나의 이벤트가 하나의 엘리먼트에만 영향을 미치는 것이 아니라 여러 개의 엘리먼트에 영향을 미칠 경우를 말함.

         

         <script type = 'text/javascript'>
              function mouseDown(nsEvent){
                  var theEvent = nsEvent ? nsEvent : window.event;
                  var locString = 'X = ' + theEvent.screenX + ' Y = ' + theEvent.screenY;
                  var theSrc = theEvent.target ? theEvent.target : theEvent.srcElement;
     
                  alert(locString + ' ' + theSrc);

                 

                  /*

                       버블 이벤트 종료 시키기 아래 함수를 호출하기 위해 이벤트  버블을 하지 않는다.

                  */

                  // document.onmousedown = stopEvent;              

             }
         
             document.onmousedown = function(evnt){
                  var theEvnt = evnt ? evnt : window.event;
                  alert('*' + theEvnt.type);
             }
     
             window.onload = setupEvents;  
     
             function setupEvents(){
                 document.getElementById('1st').onmousedown = mouseDown;
                 document.getElementById('2st').onmousedown = function () {
                        alert('Second event handler');
                 }
             }


             /* 버블 함수를 종료시키기 위한 함수 */

             /*

             function stopEvent(evnt){
                if(evnt.stopPropagation){
                    evnt.stopPropagation();   // 넷스케이프의 경우
                }else{
                   evnt.cancelBubble = true; // IE의 경우
                }
             }          

             */
         </script>

         ****************************************************************************

          <div id = '1st' style='padding : 20px ; background-color : #feb ; width : 150px'>
                <div id = '2st' style='background-color : #f00; width : 100px ; height : 100px'>
               </div>
          </div>

         *****************************************************************************


    ③ 이벤트 핸들러와 this

         이벤트  핸들러 함수나 객체 메소드 내에서 엘리먼트의 프로퍼티에 접근하기 위해 this를 사용한다.

        

         window.onload = setupObjects;
 
         function setupObjects() {
              document.personData.firstName.onblur = testValue;
         }
 
         function testValue() {
             alert('Hi ' + this.value); // 폼 필드값  
         }        

         *****************************************************************************

         <form name = 'personData'>
               First Name : <input type='text' name = 'firstName' /> <br /> <br />
               Second Name : <input type = 'text' name = 'secondName' />
         </form>

         *****************************************************************************

        

         ※ DOM 레벨 2  이벤트 모델과 이전 버전과의 차이점

             - 특정 이벤트 핸들러 프로퍼티에 의존적이지 않음.

             - 하나의 이벤트나 객체 다수의 이벤트 핸들러를 등록이 가능함.

             - 이벤트 핸들러의 프로퍼티 외에 각 객체는 세가지 메소드를 가지고 있음.


                ㉠ addEventListener

                    이벤트 리스너를 추가하기 위한 메소드

                    예)

                    object.addEventListener('이벤트명' , '이벤트 함수', true|false);

                   

                     - 이벤트명  : click 이나 onload 등등...

                     - 이벤트 함수명 : 개발자가 작성한 함수명

                     - true | false { 케스케이드다운(cascade-down)과 버블업(bubble-up)의 두 가지 방식)}

                               true : 케스케이드 다운 방식

                               false : 버블 방식


                ㉡ removeListener  

                    기존 리스너를 제거하기 위한 메소드  


                ㉢ dispatchListener  

                    이벤트를 신속히 처리하기 위한 메소드

                

                 [넷스케이프 , 파이어폭스 전용] , IE에서는 에러  

                 function writeX(evnt){
                      alert('Capturing : ' + evnt.target + ' ' + evnt.currentTarget);
                      return true;
                 }
 
                  function writeY(evnt){
                      alert('Bubbing : ' + evnt.target + ' ' + evnt.currentTarget);
                      return true;
                 }
 
                 window.onload = setup;
 
                 function setup(evnt){
                      // 이벤트 캡처
                       document.addEventListener('click', writeX, true);
                       document.forms[0].addEventListener('click',writeX,true);
                       document.froms[0].elements[0].addEventListener('click',writeX,true);
   
                      // 이벤트 버블업 - 실행되지 않음 .....        
                     document.addEventListener('click',writeY,false);

                     document.forms[0].addEventListener('click',writeY,false);
                     document.forms[0].elements[0].addEventListener('click',writeY,false);
                 }               


                 ※ AddEventListener를 IE 7에서는 지원하지 않음


                 ***********************************************************************************

                  AddEventListener를 사용하지 못할 경우 아래 와 같은 방법을 사용한다.

                  크로스 브라우저 코드

                 ***********************************************************************************

                 

                  function clickMe(evnt){
                       evnt = evnt ? evnt : window.event;
                       alert(evnt.target + ' ' +  evnt.type);
                       alert('Can be canceled? ' + evnt.cancelable);
                       alert('Bubbling? ' + evnt.bubbles);
                       alert(evnt.timeStamp);
                 }
  
                 window.onload = setup;


                 /*
                 윈도우 unload 이벤트를 캡처해서 detachEvent로 설정된 이벤트들을 제거해야 한다.
                 윈도우의 메모리 낭비를 막기위해 사용된다. 
                 */


                 window.onunload = cleanup;
  
                 function setup(evnt){
                        var evtObject = document.getElementById('clickme');
    
                        // 객체 모델 테스트
                       if(evtObject.addEventListener){
                              document.addEventListener('click',clickMe,false);
                        }else if(evtObject.attachEvent){
                              evtObject.attachEvent('onclick',clickMe);
                       }else if(evtObject.onclick){
                              evtObject.onclick = clickMe;
                       }
                }
  
                // 이벤트 핸들러 제거 (IE이 경우 적용)
                function cleanup(){
                      var evtObject = document.getElementById('clickme');
                       if(evtObject.detachEvent){
                             evtBoject.detachEvent('onclick', clickMe);
                       }
                }                 

              

    ④ 이벤트 생성

        특정 시점에 이벤트를 발생시키는 경우에 사용된다. (대표적으로 focus() 메소드를 사용하는 경우 사용한다.)

       
         window.onload = setObjects;
 
         function setObjects() {
              document.personData.lastName.focus();
         }

        <form name = 'personData'>
              First Name : <input type = 'text' name  = 'firstName' /><br /> <br />
              Last  Name : <input type = 'text' name  = 'lastName' />
        </form>


댓글 없음:

댓글 쓰기