>웹 프론트엔드 >JS 튜토리얼 >외국인이 작성한 XMLHttpRequest 코드는 다중 브라우저_javascript 기술과의 호환성을 지원합니다.

외국인이 작성한 XMLHttpRequest 코드는 다중 브라우저_javascript 기술과의 호환성을 지원합니다.

WBOY
WBOY원래의
2016-05-16 19:21:08989검색

지난 며칠 동안 XMLHTTP 지원이 필요한 Asp.Net의 WebService를 호출하기 위해 Javascript를 사용하려고 생각했지만 Opera의 XMLHttpRequest가 끔찍하고 지원되지 않는다는 것을 발견했습니다. Opera에서는 java를 사용합니다. net.URL 및 기타 클래스를 사용하여 구현됩니다. 감히 혼자만 보관할 수는 없지만 모두가 즐길 수 있도록 여기에 게시합니다.

코드 복사 코드는 다음과 같습니다.

/*

크로스 브라우저 XMLHttpRequest v1.2
========================= =======

IE 및 Opera에서 Gecko 'XMLHttpRequest()' 기능을 에뮬레이션합니다. Opera에는
Sun Java 런타임 환경이 필요합니다.

작성: Andrew Gregory
http://www.scss.com.au/family/andrew/webdesign/xmlhttprequest/

이 저작물은 Creative Commons Attribution 라이선스에 따라 라이선스가 부여됩니다. 이 라이센스의
사본을 보려면 http://creativecommons.org/licenses/by-sa/2.5/를 방문하거나
Creative Commons, 559 Nathan Abbott Way, Stanford, California
에 편지를 보내십시오. 94305, 미국.

저작자 표시: 이 스크립트에 있는 내 이름과 웹 주소를 그대로 남겨주세요.

Opera에서는 지원되지 않음
---------
* 사용자/비밀번호 인증
* responseXML 데이터 구성원

Opera에서 완전히 지원되지 않음
---------------
* 비동기 요청
* abort()
* getAllResponseHeaders(), getAllResponseHeader(header)

*/
// IE 지원
if (window.ActiveXObject && !window.XMLHttpRequest) {
window.XMLHttpRequest = function() {
    var msxmls = new 배열(
      'Msxml2.XMLHTTP.5.0',
      'Msxml2.XMLHTTP.4.0',
      'Msxml2.XMLHTTP.3.0',
      'Msxml2.XMLHTTP',
      'Microsoft.XMLHTTP');
    for (var i = 0; i < msxmls.length; i ) {
      시도 {
        새 ActiveXObject(msxmls[i]) 반환;
      } catch (e) {
      }
    }
    return null;
  };
}
// Gecko 지원
/* ;-) */
// Opera 지원
if (window.opera && !window.XMLHttpRequest) {
  window.XMLHttpRequest = function() {
    this.readyState = 0; // 0=초기화되지 않음,1=로드 중,2=로드됨,3=대화형,4=완료
    this.status = 0; // HTTP 상태 코드
    this.statusText = '';
    this._headers = [];
    this._aborted = false;
    this._async = true;
    this._defaultCharset = 'ISO-8859-1';
    this._getCharset = function() {
      var charset = _defaultCharset;
      var contentType = this.getResponseHeader('Content-type').toUpperCase();
      val = contentType.indexOf('CHARSET=');
      if (val != -1) {
        charset = contentType.substring(val);
      }
      val = charset.indexOf(';');
      if (val != -1) {
        charset = charset.substring(0, val);
      }
      val = charset.indexOf(',');
      if (val != -1) {
        charset = charset.substring(0, val);
      }
      문자셋 반환;
    };
    this.abort = function() {
      this._abort = true;
    };
    this.getAllResponseHeaders = function() {
      return this.getAllResponseHeader('*');
    };
    this.getAllResponseHeader = 함수(헤더) {
      var ret = '';
      for (var i = 0; i < this._headers.length; i ) {
        if (header == '*' || this._headers[i].h == header) {
          ret  = this._headers[i].h   ': '   this._headers[i].v   'n';
        }
      }
      반품 ret;
    };
    this.getResponseHeader = function(헤더) {
      var ret = getAllResponseHeader(헤더);
      var i = ret.indexOf('n');
      if (i != -1) {
        ret = ret.substring(0, i);
      }
      반품 ret;
    };
    this.setRequestHeader = function(헤더, 값) {
      this._headers[this._headers.length] = {h:header, v:value};
    };
    this.open = function(method, url, async, user, password) {
      this.method = method;
      this.url = url;
      this._async = true;
      this._aborted = false;
      this._headers = [];
      if (arguments.length >= 3) {
        this._async = async;
      }
      if (arguments.length > 3) {
        opera.postError('XMLHttpRequest.open() - 사용자/비밀번호가 지원되지 않음');
      }
      this.readyState = 1;
      if (this.onreadystatechange) {
        this.onreadystatechange();
      }
    };
    this.send = function(data) {
      if (!navigator.javaEnabled()) {
        alert("XMLHttpRequest.send() - Java를 설치하고 활성화해야 합니다.");
        반품;
      }
      if (this._async) {
        setTimeout(this._sendasync, 0, this, data);
        // 이것은 실제로 비동기가 아니며 현재
        // 실행 컨텍스트가 종료될 때까지 실행되지 않습니다.
      } 그렇지 않으면 {
        this._sendsync(data);
      }
    }
    this._sendasync = function(req, data) {
      if (!req._aborted) {
        req._sendsync(data);
      }
    };
    this._sendsync = function(data) {
      this.readyState = 2;
      if (this.onreadystatechange) {
        this.onreadystatechange();
      }
      // 연결 열기
      var url = new java.net.URL(new java.net.URL(window.location.href), this.url);
      var conn = url.openConnection();
      for (var i = 0; i < this._headers.length; i ) {
        conn.setRequestProperty(this._headers[i].h, this._headers[i].v);
      }
      this._headers = [];
      if (this.method == 'POST') {
        / POST 데이터
        conn.setDoOutput(true);
        var wr = new java.io.OutputStreamWriter(conn.getOutputStream(), this._getCharset());
        wr.write(데이터);
        wr.flush();
        wr.close();
      }
      //응답 헤더 읽기
      // 참고: getHeaderField() 메소드는 항상 null을 반환합니다.:(
      var gotContentEncoding =
      var gotContentLength = false
var gotContentType = false;
      var gotDate = false;
      var gotLastModified = false; 🎜>        var hdrName = conn .getHeaderFieldKey(i);
        var hdrValue = conn.getHeaderField(i);
        if (hdrName == null && hdrValue == null) {
      
        }
        if (hdrName != null) {
          this._headers[this._headers.length] = {h:hdrName, v:hdrValue};
          스위치(hdrName.toLowerCase()) {
            case 'content-encoding' : gotContentEncoding = true;  break;           case 'content-length'   = true;  break;
          case 'content-type'     =  break; >            case '날짜'            : gotDate            = true ; 부서지다;
            케이스 '만료'         : gotExpiration      = true; 부서지다;
            case 'last-modified'   : gotLastModified    = true; 부서지다;
         }
        }
      }
      // 누락된 헤더 정보를 입력해 보세요
      var val;
      val = conn.getContentEncoding();
      if (val != null && !gotContentEncoding) this._headers[this._headers.length] = {h:'Content-encoding', v:val};
      val = conn.getContentLength();
      if (val != -1 && !gotContentLength) this._headers[this._headers.length] = {h:'Content-length', v:val};
      val = conn.getContentType();
      if (val != null && !gotContentType) this._headers[this._headers.length] = {h:'Content-type', v:val};
      val = conn.getDate();
      if (val != 0 && !gotDate) this._headers[this._headers.length] = {h:'Date', v:(new Date(val)).toUTCString()};
      val = conn.getExpiration();
      if (val != 0 && !gotExpiration) this._headers[this._headers.length] = {h:'Expires', v:(new Date(val)).toUTCString()};
      val = conn.getLastModified();
      if (val != 0 && !gotLastModified) this._headers[this._headers.length] = {h:'Last-modified', v:(new Date(val)).toUTCString()};
      //응답 데이터 읽기
      var reqdata = '';
      var stream = conn.getInputStream();
      if (스트림) {
        var reader = new java.io.BufferedReader(new java.io.InputStreamReader(stream, this._getCharset()));
        var 행;
        while ((line = reader.readLine()) != null) {
          if (this.readyState == 2) { ​​
            this.readyState = 3;
            if (this.onreadystatechange) {
              this.onreadystatechange();
            }
          }
          reqdata  = line   'n';
        }
        reader.close();
        this.status = 200;
        this.statusText = '확인';
        this.responseText = reqdata;
        this.readyState = 4;
        if (this.onreadystatechange) {
          this.onreadystatechange();
        }
        if (this.onload) {
          this.onload();
        }
      } else {
        //오류
        this.status = 404;
        this.statusText = '찾을 수 없음';
        this.responseText = '';
        this.readyState = 4;
        if (this.onreadystatechange) {
          this.onreadystatechange();
        }
        if (this.onerror) {
          this.onerror();
        }
      }
    };
  };
}
// ActiveXObject 에뮬레이션
if (!window.ActiveXObject && window.XMLHttpRequest) {
  window.ActiveXObject = function(type) {
    스위치(type.toLowerCase()) {
      case 'microsoft.xmlhttp':
      케이스 'msxml2.xmlhttp':
      케이스 'msxml2.xmlhttp.3.0':
      케이스 'msxml2.xmlhttp.4.0':
      케이스 'msxml2.xmlhttp.5.0 ':
        새 XMLHttpRequest()를 반환합니다.
    }
    null을 반환합니다.
  };
}
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.