Javascript 감청 및 삭제 사용 설명 추가

7660 단어 Javascript감청
본고는 자바스크립트에 감청을 추가하고 삭제하는 용법을 실례로 다루고 있다.여러분에게 참고할 수 있도록 나누어 드리겠습니다.구체적인 분석은 다음과 같다.
js에서 이벤트 감청은 add Event Listener를 이용하여 하나의 이벤트를 연결하는 것이다. 이 용법은 jquery에서 매우 자주 사용되고 간단하지만 원생 js에서는 비교적 복잡하다. 여기에서add Event Listener 사건의 각 방법의 테스트와 예를 정리하여 참고하여 학습하도록 한다.
이틀 전에 플레이어를 할 때 감청을 추가한 후 감청을 삭제하는 데 약간의 번거로움이 생겨서 삭제할 수 없었다. 나중에 보니 파라미터가 완전히 대응해야 한다는 것을 발견했다. 무엇이 완전 대응이냐는 것이다. 다시 말하면
$('.video')[0].addEventListener('timeupdate', currentTimeHandler, true);
예를 들어 이 문장은 세 개의 매개 변수를 불러와야 삭제할 수 있는데 왜 꼭 이렇게 해야 합니까? 맞아요. 알이 아픈 곳은 바로 여기에 있습니다.
add와remove에서 세 번째 파라미터는 확실히 쓰지 않을 수 있지만, 이 때 그들의 기본 상황은 다르다!!
보통 add Event Listener는 false...
1. 사용자 정의 이벤트 감청 추가
var eventHandlesCounter=1;// ,0 
    function addEvent(obj,evt,fn){
       if(!fn.__EventID){ fn.__EventID=eventHandlesCounter++;}
       if(!obj.__EventHandles){ obj.__EventHandles=[]; }
       if(!obj.__EventHandles[evt]){
           obj.__EventHandles[evt]=[];
           if(obj["on"+evt] instanceof Function){
              obj.__EventHandles[evt][0]=obj["on"+evt];
              obj["on"+evt]=handleEvents;
           }
       }
       obj.__EventHandles[evt][fn.__EventID]=fn;
 
       function handleEvents(){
         var fns = obj.__EventHandles[evt];
         for (var i=0;i<fns.length;i++)
            fns[i].call(this);
       }
}
2. 사용자 정의 삭제 이벤트 감청
function delEvent(obj,evt,fn){
   if(!obj.__EventHandles || !obj.__EventHandles[evt] || !fn.__EventID){
      return false;
   }
   if(obj.__EventHandles[evt][fn.__EventID]==fn){
      delete obj.__EventHandles[evt][fn.__EventID];
   }
}
3. 상술한 방법을 수정한다
function addEvent(obj,evt,fn,useCapture){
    if(obj.addEventListener){// W3C
       obj.addEventListener(evt,fn,!!useCapture);
    }else{
       if(!fn.__EventID){fn.__EventID = addEvent.__EventHandlesCounter++;}
       if(!obj.__EventHandles){ obj.__EventHandles=[];}
       if(!obj.__EventHandles[evt]){
           obj.__EventHandles[evt]=[];
           if(obj["on"+evt]){
              (obj.__EventHandles[evtype][0]=obj["on"+evtype]).__EventID=0;
           }
           obj["on"+evtype]=addEvent.execEventHandles;
       }
    }
}
addEvent.__EventHandlesCounter=1;
addEvent.execEventHandles = function(evt){
    if(!this.__EventHandles) {return true;}
    evt = evt || window.event;
    var fns = this.__EventHandles[evt.type];
    for (var i=0;i<fns.length;i++){
       if(fns[i] instanceof Function){
           fns[i].call(this);
       }
    }
};
function delEvent(obj,evt,fn,useCapture){
   if (obj.removeEventListener) {// W3C         
       obj.removeEventListener(evt,fn,!!useCapture);
   }else {
      if(obj.__EventHandles){
         var fns = obj.__EventHandles[evt];
         if(fns){delete fns[fn.__EventID];}
      }
}
4. 이벤트 객체 표준화
function fixEvent(evt){
   if(!evt.target){
      evt.target = evt.srcElement;
      evt.preventDefault=fixEvent.preventDefault;
      evt.stopPropagation = fixEvent.stopPropagation;
      if(evt.type == "mouseover"){
         evt.relatedTarget = evt.fromElement;
      }else if(evt.type == "mouseout"){
         evt.relatedTarget = evt.toElement;
      }
      evt.charCode =(evt.type == "keypress")?evt.keyCode:0;
      evt.eventPhase = 2;
      evt.timeStamp = (new Date()).getTime();
   }
return evt;
}
fixEvent.preventDefault=function(){ this.returnValue=false;}
fixEvent.stopPropagation=function(){this.cancelBubble = true;};
fixEvent 함수는 단독으로 실행되지 않습니다. 이벤트 대상 파라미터가 있어야 합니다. 이벤트가 발생할 때만 실행됩니다!가장 좋은 방법은addEvent 함수의execEventHandles에 통합하는 것이다.
addEvent.execEventHandles = function (evt) {// 
if (!this.__EventHandles) {return true;}
evt = fixEvent(evt || window.event);//
var fns = this.__EventHandles[evt.type];
for (var i=0;i< fns.length;i++) {
if (fns[i] instanceof Function) {
fns[i].call(this,evt);//
// } } };
위에는 고수가 썼고, 아래에는 몇 가지 실제 감청 일의 예를 정리했다

<html>
  <head>
    <title>test6.html</title>
 <script type="text/javascript">
  function test(){
   window.alert(" ");
   document.getElementById("1").detachEvent("onclick",test);
  }
 </script>
  </head>
 
  <body>
    <input type="button" value=" " id="1"/>
    <script type="text/javascript">
     document.getElementById("1").attachEvent("onclick",test);
    </script>
  </body>
</html>
여기에는 문서를 사용합니다.getElementById("1").attachEvent("onclick",test);동적 이벤트 귀속, 사용

document.getElementById("1").detachEvent("onclick",test)
동적 시간의 취소를 진행하면 이 사건은 한 번만 상응하고 다음에 이 버튼을 눌렀을 때 더 이상 효과가 나타나지 않는다.
다음은 키보드 이벤트를 실시간으로 감청하여 입력한 숫자가 숫자인지 아닌지를 판단하고 숫자가 직접 동적 알림이 아니면 입력을 거부하는 것을 보여 줍니다.

<html>
  <head>
    <title>test7.html</title>
 <script type="text/javascript">
  function test(event){
   // ,
   if(event.keyCode<48 || event.keyCode > 57){
    window.alert(" ");
    return false;
   }
  }
 </script>
  </head>
 
  <body>
    <input type="text" onkeypress="return test(event);" />
  </body>
</html>
이곳의 이벤트는 하나의 이벤트 대상입니다. 그는 많은 정보를 되돌릴 수 있습니다. 구체적으로 관련 문서를 참고하십시오.
 
보충: 이벤트 모니터링 호환
1. IE는attachEvent/detachEvent 방법으로 이벤트 감청기를 추가하고 삭제합니다.w3c는 addEventListener/removeEventListener 방법을 사용합니다.
2. IE는 이벤트에 대해 onevent의 명칭을 사용하고 w3c는 이벤트의 명칭을 사용합니다.
3. IE 이벤트 감청기에서 사용하는 것은 전역적인 이벤트 대상이고 w3c는 이벤트 대상을 매개 변수로 감청기에 전달한다.
4. 기본 이벤트 동작을 촉발하는 것을 피하기 위해 IE의 방법은 프로그래머에게 이벤트 대상의 returnValue 속성 값을false로 설정하도록 요구하는 것이고, w3c의 방법은preventDefault 방법을 실행하는 것이다.
5. IE는 이벤트 캡처 단계를 지원하지 않습니다.
6. 이벤트의 전달을 멈추려면 IE의 방법은 이벤트 대상의 cancelBubble를true로 설정하는 것이고 w3c의 방법은 실행stopPropagation 방법을 설정하는 것이다.
7. IE는 이벤트 감청기를 하나의 독립된 함수로 호출하고 w3c는 대상의 방법으로 호출한다. 이것은 i에서 이벤트 감청기에서this 키워드는 이벤트 발생 대상이 아니라 쓸모없는 전역 대상(window 대상)을 가리킨다.
8. IE는 이벤트 모니터를 사용하는 데 메모리 유출 문제가 있습니다.IE 브라우저에서 어떤 요소에 이벤트 감청기를 만들고 감청기에서 이 요소를 사용하려면 사용자가 다른 페이지로 들어가기 전에 이 감청기와 관련된 DOM 노드가 차지하는 메모리 공간이 방출되지 않습니다.
본고에서 기술한 것이 여러분의javascript 프로그램 설계에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기