2010-01-07 3 views
8

저는 자바 스크립트를 사용하여 다른 서버의 PHP 파일에서 제공되는 일부 컨텐츠를 포함합니다. 그러나이 다른 서비스는 때로는 불안정해질 수 있으며로드하는 데 오랜 시간이 걸리거나 전혀로드되지 않습니다.자바 스크립트를 통해 느린 외부 파일을로드 할 때 정상적인 제한 시간을 적용하는 방법은 무엇입니까?

JS가 실패하고 "다시 시도하십시오"라는 메시지가 표시되기 전에 x 초 동안 외부 데이터를 가져 오는 방법이 있습니까?

<script type="text/javascript" src="htp://otherserver.com/myscript.php"></script> 
+0

... 또한 ... 내 서버는 php (또는 다른 어떤 것도 .. 야후 스토어)를 지원하지 않으며 원격 서버가 내가 잡아 당기는 다른 도메인에 있습니다. –

+1

나는 거기에 있다고 생각하지 않습니다. 이 일을 다른 방법으로 처리하는 것보다 가능한 한 페이지의 특정 자바 스크립트를 낮추는 것입니다. 따라서 나머지 페이지는 기다리는 동안로드됩니다. –

답변

2

부부 문제 : 당신은 XMLHttpRequest (일명 아약스)와 타임 아웃 임계 값을 사용할 수 있지만이 otherserver.com에 이후 당신은 XMLHttpRequest을 사용할 수 없습니다 (그리고 모든 A-등급 브라우저 지원)으로 인해 Same Origin Policy restriction에 있습니다. 스크립트가 글로벌 이름의 종류 (예를 들어 어떤 변수 이름, 함수 이름, 등) 당신은 그것을 계속 확인 setTimeout을 시도 할 수 있습니다를 소개하면

: 나는 그것이 보는 바와 같이

var TIMELIMIT = 5; // seconds until timeout 
var start = new Date; 

setTimeout(function() { 
    // check for something introduced by your external script. 
    // A variable, namespace or function name here is adequate: 
    var scriptIncluded = 'otherServerVariable' in window; 

    if(!scriptIncluded) { 
    if ((new Date - start)/1000 >= TIMELIMIT) { 
     // timed out 
     alert("Please try again") 
    } 
    else { 
     // keep waiting... 
     setTimeout(arguments.callee, 100) 
    } 
    } 
}, 100) 

문제는, 당신은 할 수 없습니다 스크립트 요청을 취소하십시오. 내가 틀렸다면 누군가가 나를 바로 잡아 주지만, DOM에서 <script>을 제거하면 브라우저의 리소스 요청이 활성 상태로 남습니다. 따라서 을 검색하면 스크립트가로드되는 데 x 초보다 오래 걸리므로 은 요청을 취소 할 수 없습니다.

운이 좋지 않을 수도 있습니다.

-1

나는이 작업을 수행하는 유일한 방법은 파일의 내용을 아약스로 가져 와서 타이머를 설정하는 것이라고 생각합니다. 타이머 전에 요청이 완료되면 eval을 사용하여 응답을 평가할 수 있습니다 (더 좋은 해결책은 아닙니다). 그렇지 않으면 Ajax 요청을 중지하고 오류 메시지를 작성할 수 있습니다.

+1

AJAX를 사용할 수 없습니다. 스크립트가 다른 도메인에 있습니다. – JPot

2

나는 이것을 생각할 수있는 유일한 방법은 (PHP 사용 가능) 서버를 추가하는 것입니다.이 서버는 데이터를 가져 오지만 특정 제한 시간 한도에 도달하면 중지됩니다 그냥 빈 결과를 반환 할 수 있습니다).

0

이것은 순전히 순전히 이론적 인 :

<script> 태그 동적 스크립트가 페치 및 처리 될 지적되는 DOM에 삽입 될 수있다. 이 동적 스크립트 태그 삽입은 교차 도메인 "AJAX"를 달성하는 방법입니다.

전역 변수 var hasLoaded = false;을 선언 할 수 있다고 생각합니다. 스크립트를 끝내고로드하려고하면 해당 변수를 true로 설정할 수 있습니다 hadLoaded=true;. DOM에 스크립트 태그를 삽입 한 후 콜백 함수가 "hasLoaded"가 true로 설정되어 있는지 확인하는 setTimeout()을 시작할 수 있습니다. 그렇지 않은 경우 스크립트가 아직 브라우저에 완전히로드되지 않았다고 가정 할 수 있습니다. 있다면, 완전히로드했다고 가정 할 수 있습니다.

다시 말하지만 이론적 인 내용이지만 테스트를 거쳤다면 다시보고해야합니다. 매우 궁금합니다.

+0

또한 DOM에서 스크립트 태그를 제거하면 요청을 "취소"할 수 있습니까?아마도 제 생각에는 아니지만 시도해 볼 또 다른 실험입니다. –

+0

스크립트 태그 자체의로드에서이 작업을 수행했습니다. 한 번해볼 만하다. – nagytech