> 웹 프론트엔드 > JS 튜토리얼 > Mozilla_기본 지식에서 자주 사용되는 Javascript 코드 게시

Mozilla_기본 지식에서 자주 사용되는 Javascript 코드 게시

WBOY
풀어 주다: 2016-05-16 19:21:43
원래의
928명이 탐색했습니다.

Mozilla의 고유 리더 및 작성자(defineGetter, DefineSetter)는 Elements, Events 등에 프로토타입을 추가할 수 있으므로 IE에서 사용하는 메소드를 Mozilla에서도 적용할 수 있습니다.
예를 들어
obj.insertAdjacentHTML, currentStyle, obj.attachEvent, obj.detachEvent 등

저작권은 webfx Erik Arvidsson에게 있습니다

코드 복사 코드는 다음과 같습니다.
if (Browser.isMozilla) { // Moz 환경 설정 

   

  extendEventObject(); 
  emulateAttachEvent(); 
  emulateEventHandlers(["click", "dblclick", "mouseover", "mouseout", 
              "mousedown", "mouseup", "mousemove",
             "keydown", "keypress", "keyup "]); 

  emulateCurrentStyle(); 
  /*emulateDocumentAll(); 
  emulateElement() 
  */ 

  // event.button에 상수를 사용하는 것이 더 좋습니다.
 Event.LEFT = 0; 
  Event.MIDDLE = 1; 
  이벤트.RIGHT = 2; 

else { 
  이벤트 = {}; 
  // IE가 잘못된 버튼 번호를 반환하고 있습니다.
 Event.LEFT = 1; 
  Event.MIDDLE = 4; 
  이벤트.RIGHT = 2; 


/* 
 * srcElement, cancelBubble, returnValue, 
 * fromElement 및 toElement를 사용하여 이벤트 객체를 확장합니다.
 */ 
함수 extendEventObject() { 
Event.prototype.__defineSetter__("returnValue", function (b) { 
    if (!b) this.preventDefault(); 
    return b; 
  }); 

  Event.prototype.__defineSetter__("cancelBubble", function (b) { 
    if (b) this.stopPropagation(); 
    return b; 
  }); 

  Event.prototype.__defineGetter__("srcElement", function () { 
    var node = this.target;
    while (node.nodeType != 1) node = node.parentNode;
    반환 노드;
  }); 

  Event.prototype.__defineGetter__("fromElement", function () { 
    var node; 
    if (this.type == "mouseover") 
      node = this.관련Target;
    else if (this.type == "mouseout") 
      node = this.target; 
    if (!node) return; ; 
    반환 노드; 
  }); 

  Event.prototype.__defineGetter__("toElement", function () { 
    var node; 
    if (this.type == "mouseout") 
      node = this.관련Target;
    else if (this.type == "mouseover") 
      node = this.target; 
    if (!node) return; ; 
    반환 노드; 
  }) 

  Event.prototype.__defineGetter__("offsetX", function () { 
    return this.layerX; 
  }); 
  Event.prototype.__defineGetter__("offsetY", function () { 
    return this.layerY; 
  }); 


/* 
 * element.attachEvent와 detachEvent를 에뮬레이트합니다.
 */ 
함수 emulateAttachEvent() { 
  HTMLDocument.prototype.attachEvent = 
  HTMLElement.prototype.attachEvent = 함수 (sType, fHandler) { 
    var shortTypeName = sType.replace(/on/, ""); 
    fHandler._ieEmuEventHandler = 함수 (e) { 
      window.event = e; 
      return fHandler(); 
    }; 
    this.addEventListener(shortTypeName, fHandler._ieEmuEventHandler, false); 
  }; 

  HTMLDocument.prototype.detachEvent = 
  HTMLElement.prototype.detachEvent = 함수(sType, fHandler) { 
    var shortTypeName = sType.replace(/on/, ""); 
    if (typeof fHandler._ieEmuEventHandler == "함수") 
      this.removeEventListener(shortTypeName, fHandler._ieEmuEventHandler, false); 
    else 
      this.removeEventListener(shortTypeName, fHandler, true); 
  }; 


/* 
 * 이 함수는
 * 이벤트에서 전달된 이벤트 객체를 window.event
 */
함수 emulateEventHandlers(eventNames)에 바인딩합니다.{ 
  for (var i = 0; i     document.addEventListener(eventNames[i], function (e) { 
      window.event = e; 
    }, 진실);  // 캡처 사용 
  } 


/* 
 * document.all의 간단한 에뮬레이션 
 * 이것은 아직 완성되지 않았습니다. 주의 
 */ 

function emulateAllModel() { 
  var allGetter = function () { 
    var a = this.getElementsByTagName("*"); 
    var node = 이; 
    a.tags = 함수 (sTagName) { 
      return node.getElementsByTagName(sTagName); 
    }; 
    return a; 
  }; 
  HTMLDocument.prototype.__defineGetter__("all", allGetter); 
  HTMLElement.prototype.__defineGetter__("all", allGetter); 


function extendElementModel() { 
  HTMLElement.prototype.__defineGetter__("parentElement", function () { 
    if (this.parentNode == this.ownerDocument) return null;
    return this.parentNode; 
  }); 

  HTMLElement.prototype.__defineGetter__("children", function () { 
    var tmp = []; 
    var j = 0; 
    var n; 
    for(var i = 0;  i <  this.childNodes.length;  i ) { 
      n = this.childNodes[i]; 
      if (n.nodeType == 1) { 
       tmp[j ] = n; [ tmp[n.name].length] = n;
        } 
        if (n.id)    // ID가 있는 하위 
          tmp[n.id] = n 
      } 
    } 
    return tmp; 
  }); 

  HTMLElement.prototype.contains = function (oEl) { 
    if (oEl == this) return true; 
    if (oEl == null) false를 반환합니다. 
    return this.contains(oEl.parentNode); 
  }; 


함수 emulateCurrentStyle() { 
  HTMLElement.prototype.__defineGetter__("currentStyle", function () { 
    return this.ownerDocument.defaultView.getCompulatedStyle(this, null); 
    /* 
    var cs = {}; 
    var el = this; 
    for(var i = 0; i < properties.length; i ) { 
      cs.__defineGetter__(속성[ i], encapsulateObjects(el, properties[i])); 
    } 
    return cs; 
    */ 
  }); 


함수 emulateHTMLModel() { 

  // 이 함수는 텍스트 속성/메서드에 대한 HTML 문자열을 생성하는 데 사용됩니다.
  // 'n'은 다음으로 대체됩니다.  또한 연속된 공백을 수정합니다.
  // 또한 일부 특수 문자를 바꿉니다.
  function convertTextToHTML(s) { 
    s = s.replace(/&/g, "&").replace(/< ;/g, "<").replace(/>/g, ">").replace(/n/g, "
"); 
    동안 (/ss/.test(s)) 
      s = s.replace(/ss/, "  "); 
    return s.replace(/s/g, " "); 
  } 

  HTMLElement.prototype.insertAdjacentHTML = 함수(sWhere, sHTML) { 
    var df;  // : DocumentFragment 
    var r = this.ownerDocument.createRange(); 

    전환 (String(sWhere).toLowerCase()) { 
      case "beforebegin": 
        r.setStartBefore(this); 
        df = r.createContextualFragment(sHTML); 
        this.parentNode.insertBefore(df, this); 
        휴식; 

      case "afterbegin": 
        r.selectNodeContents(this); 
        r.collapse(true); 
        df = r.createContextualFragment(sHTML); 
        this.insertBefore(df, this.firstChild); 
        휴식; 

      case 'beforeend': 
        r.selectNodeContents(this); 
        r.collapse(false); 
        df = r.createContextualFragment(sHTML); 
        this.appendChild(df); 
        휴식; 

      case 'afterend': 
        r.setStartAfter(this); 
        df = r.createContextualFragment(sHTML); 
        this.parentNode.insertBefore(df, this.nextSibling); 
        휴식; 
    } 
  }; 

  HTMLElement.prototype.__defineSetter__("outerHTML", function (sHTML) { 
   var r = this.ownerDocument.createRange(); 
   r.setStartBefore(this);
   var df = r.createContextualFragment(sHTML); 
   this.parentNode.replaceChild(df, this); 

   return sHTML; 
  }) 

  HTMLElement.prototype.__defineGetter__("canHaveChildren", function () { 
    스위치(this.tagName) { 
      case "AREA": 
      case "BASE": 
      case "basefont": case "col": case "frame": case "hr": case "img": case "br": case "input ": 
      케이스 "ISINDEX": 
      케이스 "LINK": 
      케이스 "META": 
      케이스 "PARAM": 
        return false; 
    }    true를 반환합니다.
  }); 

  HTMLElement.prototype.__defineGetter__("outerHTML", function () { 
    var attr, attrs = this.attributes; 
    var str = "<"   this.tagName;
    for (var i = 0; i < attrs.length; i ) { 
      attr = attrs[i]; 
      if (attr.specified) 
        str  = " "   attr.name   '="'   attr .value   '"'; 
    } 
    if (!this.canHaveChildren) 
      return str   ">"; 

    return str   ">"   this.innerHTML   "";
  }); 

  HTMLElement.prototype.__defineSetter__("innerText", function (sText) { 
    this.innerHTML = convertTextToHTML(sText); 
    return sText;
  }); 

  var tmpGet; 
  HTMLElement.prototype.__defineGetter__("innerText", tmpGet = function () { 
    var r = this.ownerDocument.createRange(); 
    r.selectNodeContents(this); 
    return r.toString (); 
  }); 

  HTMLElement.prototype.__defineSetter__("outerText", function (sText) { 
    this.outerHTML = convertTextToHTML(sText); 
    return sText; 
  }); 
  HTMLElement.prototype.__defineGetter__("outerText", tmpGet); 

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