Q. Button의 onclick 이벤트 발생 시,

     onclick_button() 이라는 이벤트 핸들러가 수행되도록 설정하려면 어떻게 해야할까?

    : 객체의 이벤트리스너에 이벤트핸들러를 등록한다.

        * 이벤트 핸들러 == 이벤트 처리기, 이벤트 발생 시 수행되는 함수

        * 이벤트 리스너 == 이벤트 발생 인지기, 이벤트 발생을 인지하고, 수행할 함수들을 알고 있다.

 

1,2번은 간편하게 사용되는 등록방법이고,

3번에서 제시되는 등록방법과 삭제방법을 모두 사용하면 이벤트 처리과정을 상세하게 다룰 수 있다.

 

1. HTML 태그에서 등록

형    식

사  용  예

 event = "eventHandler()"  <input type="button" onclick="onclick_button()">

  * 이벤트핸들러에 ""()를 꼭 사용

 

2. javascript에서 등록

형    식

사  용  예

 object.event = eventHandler;

 var btn = document.getElementById("btn");

 btn.onclick = onclick_button;

    * 괄호를 쓰지 않기 때문에 괄호 안에 파라미터들을 넣을 수 없다.

 

3. 이벤트 리스너에 등록 / 삭제 (이벤트에 ""를 사용)

  3.1 등록

        case #1. -  InternetExplorer (이하 IE) 

형    식

사  용  예

 obj.attachEvent("event", eventHandler)

 var btn = document.getElementById("btn"); 

 btn.attachEvent("onclick", onclick_button);

 

 

 

       case #2. -  FireFox 및 기타 브라우저 (이하 FF)

형    식

사  용  예

 obj.addEventListener("event", eventHandler, bool)

 var btn = document.getElementById("btn"); 

 btn.addEventListener("click", onclick_button, false);

   

 

 

 

        * "event" 이름 앞의 on 빠지는 것에 주의 (IE: onclick <--> FF: click)

        * bool: capture 여부

           자세한 사항은 W3C의 HTML 이벤트처리 권고안 또는 이벤트 처리 상세내용(DOM 레벨1) 참고

 

       case #3. - 크로스 브라우저 (IE, FF 등 모든 브라우저에서 사용할 수 있도록)

형    식

사  용  예

 각 브라우저가 제공하는 이벤트리스너를 확인 

 if (obj.attachListener) {                    // IE

  obj.attachEvent("event", eventHandler);

 } else if (obj.addEventListener) {      // FF

  obj.addEventListener("event", eventHandler, bool);

 }

 var btn = document.getElementById("btn");  

 if (btn.attachListener) {                    // IE

  btn.attachEvent("onclick", onclick_button);

 } else if (btn.addEventListener) {      // FF

  btn.addEventListener("click", onclick_button, false);

 }

 

 

 

 

 

 

 

 

         *  IE 7.0 이상에서는 if (window.ActiveXObject)를 사용하여 IE 브라우저임을 확인 (XMLHttpRequest 참조)

 

  3.2 삭제 (3.1 case #3.에 대응) 

형    식

사  용  예

  각 브라우저가 제공하는 이벤트리스너를 확인

 

 if (obj.attachListener) {                    // IE

  obj.detachEvent("event", eventHandler);

 } else if (obj.addEventListener) {      // FF

  obj.removeEventListener("event", eventHandler, bool);

 }

 var btn = document.getElementById("btn"); 

 

 if (btn.attachListener) {                    // IE

  btn.detachEvent("onclick", onclick_button);

 } else if (btn.addEventListener) {      // FF

  btn.removeEventListener("click", onclick_button, false);

 }

 

 

 

 

 

 

 

 

 

        * detachEvent 및 removeEventListener의 사용 시 인수들의 순서는

           attachEvent 와 addEventListener와 동일하다. (3.1 참조)


<예제> 1. "크기 바꾸는 스타일 적용" 버튼을 누르면, 텍스트상자의 크기가 변하고, <-- changeHeight() 함수 호출

            2. "새 버튼 생성" 버튼을 누르면, 새 버튼이 생성되어 화면에 추가된다. <-- createButton() 함수 호출

            3. "메시지 창 띄우기" 버튼을 누르면, 메시지 창이 화면에 나타난다. <-- alertButton_click() 함수 호출

 

1. HTML 태그에 직접 / 2. javascript에서 직접 / 3. javascript에서 이벤트 리스너에

각각 이벤트 핸들러 함수를 등록하여, 이벤트가 발생했을 때 수행되도록 작성했다.   " " 및 ( ) 표시에 주의!


  
<html>
  <head>
    <title>이벤트 핸들러 테스트 페이지</title>
    <script language="javascript">
 
      function changeHeight()
      {
        var obj = document.getElementById("log");
        if(obj.style.height == "200px") {
          obj.style.height = "100px"; 
        } else {
          obj.style.height = "200px";
        }
        obj.value += "변경된 크기: " + obj.style.height + "\n";
      }
 
      function load()
      {
        var obj = document.getElementById("log");
        obj.value = "HTML 객체들의 개수: " + document.all.length + "\n"; 
        obj.value += "log의 객체 태그이름: " + document.all.log.nodeName + "\n";
        obj.value += "info의 HTML 문자열: " + document.all.info.innerHTML + "\n";
        
        // 2. javascript에서 직접등록 ojb.event = eventHandler;
        var btn = document.getElementById("createBtn");
        btn.onclick=createButton;                     
 
       // 3. javascript에서 이벤트 리스너에 등록
        var al = document.getElementById("alertBtn");
        if (al.attachListener) {                     // IE                  * IE 7.0 이상에서는 (window.ActiveXObject)를 사용
          al.attachEvent("onclick", alertButton_click);
        } else if (al.addEventListener) {      // FF
          al.addEventListener("click", alertButton_click, false);
        }
      } 
     
      function createButton()
      {
        var panel = document.getElementById("myDiv");
        var newObj = document.createElement("INPUT");      
        newObj.type = "button";                                   
        newObj.value = "New Button";
        panel.appendChild(newObj);                               
      }
     
      function alertButton_click()
      {
        alert("메시지 창 띄우기 버튼을 클릭했습니다.");
      }
 
    </script>
  </head>
 
 
  <body onload="load()">
    <h2 id="info">연습해보겠습니다.</h2>

    // 1. HTML 태그에서 직접등록
    <input id="heightBtn" type="button" value="크기 바꾸는 스타일 적용" onclick="changeHeight()"></input>
    // 2. javascript에서 직접등록
    <input id="createBtn" type="button" value="새 버튼 생성"></input>
    // 3. javascript에서 이벤트 리스너에 등록
    <input id="alertBtn" type="button" value="메시지 창 띄우기"></input>
    <br>
    <textarea id="log" style="width:100%; height:200px;"></textarea>
    <br>
    <div id="myDiv"></div>
  </body>
</html>
AND