지난 며칠 동안 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을 반환합니다.
};
}