ajax 를 더욱 우호 적 으로 실현 하 는 방법(배경 처리 진 도 를 실시 간 으로 표시 합 니 다.)

4728 단어 ajax우호적이다
ajax 응용 이 점점 많아 지고 있 습 니 다.대부분의 ajax 처 리 는 프론트 데스크 에'loading...'을 표시 한 다음 에 데 이 터 를 서버 에 제출 하여 처리 하고 처리 가 끝 난 후에'처리 완료'를 표시 합 니 다.ajax 를 더욱 우호 적 으로 만 들 수 있 습 니까?서버 처리 진 도 를 실시 간 으로 표시 할 수 있 습 니까?이것 은 파일 업로드,메 일 발송,대량 처리 등 오 랜 요청 에서 특히 중요 하 다.답 은 당연히 가능 하 죠.그렇지 않 으 면 이 걸 쓰 지 않 을 거 예요.그 렇 죠?^ ^.존재 하 는 문제점:위의 기능 을 실현 하려 면 다음 과 같은 몇 가지 문 제 를 해결 해 야 한다.1.서버 가 일부 데 이 터 를 처리 한 후에 일부 response 를 브 라 우 저 에 전달 하 는 방법.2.브 라 우 저 는 서버 가 전달 하 는 일부 데 이 터 를 어떻게 처리 하고 http 연결 을 완전히 처리 할 때 까지 유지 할 수 있 습 니까?첫 번 째 문 제 를 해결 하려 면 flush 를 사용 하여 response 블록 을 나 누 어 보 여주 면 됩 니 다.구체 적 으로 제 다른 수필 인'flush 는 페이지 를 블록 으로 나 누 어 점차적으로 보 여 줍 니 다'를 참고 하 십시오.두 번 째 문 제 는 XML HttpRequest 의 ready State 상 태 를 사용 해 야 합 니 다.w3c 는 ready State 에 대해 다음 과 같은 몇 가지 값 을 정의 합 니 다:UNSENT=0;/요청 을 보 내지 않 았 습 니 다.OPENED=1;/http 연결 HEADERS 를 열 었 습 니 다.RECEIVED = 2; // response header LOADING=3;/진짜 응답 body DONE=4;/요청 접수 완료 상태 4 는 매일 사용 하고 있 으 며,우리 가 필요 로 하 는 것 은 상태 3 입 니 다.인 스 턴 스:쓸데없는 말 하지 마 세 요.코드 인 스 턴 스 는 어떤 문자 해석 보다 도 효과 가 있 습 니 다.서버 의 1 개 처리 에 6 초,1 초 에 1 개의 기록 을 처리 하고 총 6 개의 기록 을 처리 해 야 한다 고 가정 합 니 다.우 리 는 서버 가 1 개의 데 이 터 를 처리 할 때마다 클 라 이언 트 는 처리 진 도 를 표시 해 야 합 니 다(문자 와 진도 항목 포함).서버 엔 드 코드(아래 JSP 코드):
 
<%
// Content-Type:application/x-javascript Webkit (chrome,safari)
response.setHeader("Content-Type","application/x-javascript");
int count = 6; // 6
for(int i=0;i<count;i++){
// ,
out.println(i+1);
out.flush();
// 1
Thread.currentThread().sleep(1000);
}
%>
html 코드:
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style>
#divProgress{width:300px;height:24px;position:relative;}
#divProgress div{position:absolute;left:0;top:0;height:24px;}
#progressBg{background-color:#B9F8F9;z-index:10;}
#progressText{z-index:15;text-align:center;width:100%;}
</style>
</head>
<body>
<div id="divProgress">
<div id="progressBg"></div>
<div id="progressText"></div>
</div>
<br />
<button onclick="send()"> </button>
<script>
var t = document.getElementById("progressText");
var bg = document.getElementById("progressBg");
function send(){
t.innerHTML = "loading...";
bg.style.width = "0px";
var xhr = new window.XMLHttpRequest();
if(!window.XMLHttpRequest){
try {
xhr = new window.ActiveXObject("Microsoft.XMLHTTP");
} catch(e) {}
}
xhr.open("post","http://localhost:801/ChunkTest/chunk.jsp?count=6");
var oldSize=0;
xhr.onreadystatechange = function(){
if(xhr.readyState > 2){
var tmpText = xhr.responseText.substring(oldSize);
oldSize = xhr.responseText.length;
if(tmpText.length > 0 ){
//
t.innerHTML = tmpText + "/6";
//
var width = parseInt(tmpText)/6*300;
bg.style.width = width+"px";
}
}
if(xhr.readyState == 4){
//
t.innerHTML = " ";
bg.style.width = "300px";
}
}
xhr.send(null);
}
</script>
</body>
</html>
실행 효과 도:  단점:여 기 를 보면 꿈 틀 거 릴 지도 모 르 니 직접 해 보고 싶 어 요.하지만 위의 방법 이 좋 지만 브 라 우 저의 지원 문제 라 는 단점 도 있다.현재 IE 의 모든 버 전의 브 라 우 저 는 xhr.ready State==3 상 태 를 지원 하지 않 습 니 다.IE 브 라 우 저 는 response 응답 이 끝나 기 전에 responseText 속성 을 읽 는 것 을 지원 하지 않 습 니 다.구체 적 으로 MSDN:XML HttpRequest Object 는 Webkit 기반 브 라 우 저 지원 이 좋 지 않 습 니 다.Content-type:application/x-javascript 을 설정 해 야 합 니 다.단점 을 본 후에 당신 의 적극성 에 타격 을 주 었 습 니까?사실은 IE 에 대해 우 리 는 너무 많은 처 리 를 할 필요 가 없습니다.IE 가 지원 하지 않 으 면 진 도 를 표시 하지 않 고 전통 적 인 ajax 요청 과 마찬가지 로 요청 이 끝 날 때 까지 1 개의 loading 을 표시 합 니 다.저 희 는 간단 한 판단 을 하나 더 해 야 합 니 다.만약 에 ie 라면 xhr.ready State>2 의 코드 를 실행 하지 않 을 것 이 라 고 판단 합 니 다.판단 을 하지 않 으 면 IE 에서 JS 오 류 를 보고 할 것 입 니 다.DEMO:demo 서버 가 좋 지 않 고 외국 에 서 는 언제든지 클릭 하지 못 할 수도 있 습 니 다.그리고 가끔 운행 효과 가 좋 지 않 습 니 다.코드 copy 를 로 컬 로 테스트 하 는 것 이 좋 습 니 다.fireforx 나 chrome 을 사용 하여 demo 를 보 세 요.ie 가 보 는 효 과 는 일반적인 ajax 와 다 르 지 않 습 니 다.http://213.186.44.204:8080/ChunkTest/index.html  전재 출처 를 밝 혀 주 십시오:http://www.cnblogs.com/BearsTaR/。 상용 금지!

좋은 웹페이지 즐겨찾기