> 웹 프론트엔드 > JS 튜토리얼 > JavaScript의 크로스 브라우저 이벤트 처리에 대한 자세한 해석_기본 지식

JavaScript의 크로스 브라우저 이벤트 처리에 대한 자세한 해석_기본 지식

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2016-05-16 15:45:35
원래의
1143명이 탐색했습니다.

1. 이벤트 객체 획득에 대하여

FF는 약간 완고하며 인수[0]만 지원하고 window.event는 지원하지 않습니다. 이번에는 IE를 비난하지 않습니다. 이벤트를 창 속성으로 사용하는 것은 표준에 어긋나지만, 수년이 지난 지금은 모두가 이 작은 문제의 존재를 묵인했습니다. 따라서 크로스 브라우저 이벤트 객체를 얻는 방법에는 두 가지가 있습니다:

인삼과 함께:

getEvent : function(event){
  return event ? event : window.event;
  //return event || window.event;//或者更简单的方式
}
로그인 후 복사

인삼이 없는 경우:

function getEvent() {
  return arguments[0] ? arguments[0] : window.event;
  //return arguments[0] || window.event;//或者更简单的方式
}
로그인 후 복사

특히 한 가지 방법을 설명해야 합니다. HTML의 DOM0 레벨 방법, 매개변수가 있는 이벤트 핸들러는 다음과 같습니다.

function handler(event){
  //do something
}
<!-- HTML的DOM0级方式 --><br /><button id="btn" onclick="handler(event);">按钮</button><br />
로그인 후 복사

위 방법은 모든 브라우저와 호환되지만 HTML의 DOM0 레벨 방법에 의존한다는 단점이 명백하여 처음 두 가지처럼 주류 방법으로 자리잡지는 못했고, JS의 DOM0 레벨 방법에는 매개변수 장치를 사용한 이벤트 처리 기능이 있습니다. , 다음과 같습니다:

function handler(event){
  //do something
}
btn.onclick = handler;//JS的DOM0级方式
//btn.onclick = function(event){/*do something*/}//或者匿名函数,效果同上
로그인 후 복사

이 방법은 모든 브라우저와 호환되지 않으며, [IE8-]는 지원되지 않으며, IE9는 알 수 없으며, FF 및 Chrome에서는 지원됩니다. 저는 항상 HTML의 DOM0 수준 이벤트 처리와 JS의 DOM0 수준 이벤트 처리가 동일하다고 생각했습니다. 이제 많은 실험을 해본 결과 둘 사이에 차이가 있음을 발견했습니다.

2. 이벤트 소스 획득에 대해

event.srcElement는 [IE8-]의 유일한 메소드이며, IE9는 알 수 없으며, 다른 브라우저는 표준 event.target 메소드를 지원합니다

3. 이벤트 차단 기본 동작에 대해

event.preventDefault()는 표준 메소드이지만 [IE8-]에서는 IE 자체 메소드가 event.returnValue = false입니다.

4. 이벤트 확산 방지 관련

event.stopPropagation()은 표준 메소드입니다. IE는 다음과 같이 플레이하고 싶어합니다. event.cancelBubble = true; 취소는 메소드가 아니라 속성이므로 여기서는 특별한 주의가 필요합니다. 표준과 거리가 멀고 사용하기 쉽습니다.

5. 이벤트 핸들러 추가 및 제거 정보

DOM 레벨 0 방식

ele.onclick = handler;ele.onclick=null;가장 오래된 방법

장점: 모든 브라우저와 호환

단점: 동일한 이벤트는 하나의 이벤트 핸들러만 바인딩/바인딩 해제할 수 있습니다

DOM 레벨 2 방법

ele.add/removeEventListener(eventType, handler, catch);

로그인 후 복사

IE 모드: ele.attach/detachEvent('on' eventType, handler);

장점: 여러 이벤트 핸들러 바인딩/바인딩 해제 지원

단점: 호환성 판단이 필요합니다. 표준 메소드의 마지막 매개변수는 이벤트 캡처 단계에서 바인딩/바인딩 해제 여부를 나타냅니다. IE는 이벤트 캡처를 지원하지 않으므로 세 번째 매개변수는 없습니다

.

참고: IE 메소드에서는 메소드 이름이 표준과 다를 뿐만 아니라 매개변수의 이벤트 유형도 on으로 추가해야 합니다. 그렇지 않으면 바인딩이 유효하지 않지만 오류가 보고되지 않습니다

6. 크로스 브라우저 이벤트 처리

//跨浏览器的事件处理器添加方式
var EventUtil = {
  addHandler : function(elem, type, handler){
    if(elem.addEventListener){
      elem.addEventListener(type, handler, false);
    }
    else if(elem.attachEvent){
      elem.attachEvent("on" + type, handler);//添加多个同一类型的handler时,IE方式的规则是最后添加的最先触发
    }
    else{
      if(typeof elem["on" + type] === 'function'){
        var oldHandler = elem["on" + type];
        elem["on" + type] = function(){
          oldHandler();
          handler();
        }
      }
      else{
        elem["on" + type] = handler;//支持添加多个事件处理器
      }
    }
  },

  getEvent : function(event){
    return event &#63; event : window.event;
  },

  getTarget : function(event){
    return event.target || event.srcElement;
  },

  preventDefault : function(event){
    if(event.preventDefault){
      event.preventDefault();
    }
    else{
      event.returnValue = false;
    }
  },

  removeHandler : function(elem, type, handler){
    if(elem.removeEventListener){
      elem.removeEventListener(type, handler, false);
    }
    else if(elem.detachEvent){
      elem.detachEvent("on" + type, handler);
    }
    else{
      elem["on" + type] = null;//不支持移除单一事件处理器,只能全部移除
    }
  },

  stopPropagation : function(event){
    if(event.stopPropagation){
      event.stopPropagation();
    }
    else{
      event.cancelBubble = true;
    }
  },

  getRelatedTarget : function(event){
    if(event.relatedTarget){
      return event.relatedTarget;
    }
    else if(event.toElement && event.type == "mouseout"){
      return event.toElement;
    }
    else if(event.fromElement && event.type == "mouseover"){
      return event.fromElement;
    }
    else{
      return null;
    }
  },

  /*IE8点击左键和中键都是0;FF无法识别中键;Chrome正常*/
  getButton : function(event){//返回0,1,2 - 左,中,右
    if(document.implementation.hasFeature("MouseEvents", "2.0")){
      return event.button;
    }
    else{
      switch(event.button){
        case 0:case 1:case 3:case 5:case 7:
          return 0;
          break;
        case 2:case 6:
          return 2;
          break;
        case 4:
          return 1;
          break;
        default:
          break;
      }
    }
  },

  /*只能检测keypress事件,返回值等于将要显示的字符编码*/
  /*IE和Chrome只有能显示的字符键才触发,FF其它键也能触发,返回值为0*/
  getCharCode : function(event){
    if(typeof event.charCode == "number"){
      return event.charCode;
    }
    else{
      return event.keyCode;
    }
  }
};

로그인 후 복사

종합예

프로젝트에서 jQuery와 같은 라이브러리를 사용하지 않는 경우 이벤트를 요소에 쉽게 바인딩하고 다양한 브라우저와 호환되도록 하려면 어떻게 해야 할까요? 다음과 같은 간단한 유틸리티를 고려해야 합니다.

var eventUtility = {
  addEvent : function(el, type, fn) {
    if(typeof addEventListener !== "undefined") {
      el.addEventListener(type, fn, false);
    } else if(typeof attachEvent !== "undefined") {
      el.attachEvent("on" + type, fn);
    } else {
      el["on" + type] = fn;
    }
  },

  removeEvent : function(el, type, fn) {
    if(typeof removeEventListener !== "undefined") {
      el.removeEventListener(type, fn, false);
    } else if(typeof detachEvent !== "undefined") {
      el.detachEvent("on" + type, fn);
    } else {
      el["on" + type] = null;
    }
  },

  getTarget : function(event) {
    if(typeof event.target !== "undefined") {
      return event.target;
    } else {
      return event.srcElement;
    }
  },

  preventDefault : function(event) {
    if(typeof event.preventDefault !== "undefined") {
      event.preventDefault();
    } else {
      event.returnValue = false;
    }
  }
};

로그인 후 복사

사용 예:

var eventHandler = function(evt) {
  var target = eventUtility.getTarget(evt),
    tagName = target.tagName;

  if(evt.type === "click") {
    if(tagName === "A" || tagName === "BUTTON") {
      alert("You clicked on an A element, and the innerHTML is " + target.innerHTML + "!");
      eventUtility.preventDefault(evt);
    }
  } else if(evt.type === "mouseover" && tagName === "A") {
    alert("mouseovered " + target.innerHTML);
  }

};

eventUtility.addEvent(document, "click", eventHandler);
eventUtility.addEvent(document, "mouseover", eventHandler);

eventUtility.removeEvent(document, "mouseover", eventHandler);

로그인 후 복사


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿