2013-08-30 3 views
3

Google은 Google지도 지오 코드 API에 대한 상호 도메인 호출을 만들고 있습니다. 이것은 현대적인 브라우저에서 모든 작업을 훌륭하게 수행하고 있었지만 IE8에서는 전혀 작동하지 않았습니다. 그것은 IE9에서도 (부분적인 CORS 지원) ​​실패 할 것 같습니다. 이로 인해 IE8-9를 처리 할 XDR (XDomainRequest)가 포함되었습니다. IE8에서 데이터를 다시 얻으려는 독립형 테스트에서 정상적으로 작동했습니다.* 동기 * XDomainRequest (XDR) 요청을 시뮬레이트하는 방법

XDR은 비동기 적으로 작동하므로 xdr.onload가 실행되기 전에 내 지오 코드 함수가 반환됩니다. 내가 IE8에서 위의 경고은 "위치를 확인할 수 없습니다"타격있어

var location = Geocode(city, state); 

if (!location) { 
    alert('Unable to determine the location of the city and state you entered'); 
    StopLoading(); 
    return; 
} 
//function then uses location.lat and location.lng coordinates 

: 내 검색 기능에서

, 나는 지오 함수를 호출합니다.

여기 내 지오 기능이다 : 나는 지오 함수에서 경고 (JSON)을 주석 경우 요청이 완료 시간으로 채워을 가지고, 그래서 그 블록 조작이 때문에

Geocode = function (address, state) { 
var protocol = location.protocol, 
    url = '//maps.googleapis.com/maps/api/geocode/json?sensor=false&address=', 
    param = encodeURIComponent(address + ', ' + state), 
    json = {}; 

if ('XDomainRequest' in window && window.XDomainRequest !== null) { 
    //IEs that do not support cross domain xhr requests 
    var xdr = new XDomainRequest(); 

    xdr.open('get', protocol + url + param); 
    xdr.onload = function() { 
     json = jQuery.parseJSON(xdr.responseText); 
    }; 
    xdr.send(); 
} else { 
    //good browsers 
    jQuery.ajax({ 
     url: protocol + url + param, 
     type: 'get', 
     dataType: 'json', 
     async: false, 
     success: function(data) { 
      json = data; 
     } 
    }); 
} 

//alert(json); 
if (json.status !== 'OK') { 
    alert('Unable to determine the location of the city and state you entered'); 
    return null; 
} 

return json.results[0].geometry.location; 
}; 

, 나는 IE8에서 내 결과를 얻을 수 내 json 개체. 주석을 해제하면 json 객체가 채워지지 않습니다.

누구나 IE에서이 작업을 수행 할 수있는 아이디어가 있습니까?

+0

이 왜 대신 코드를 비동기 호환되도록 같은 jqXHR.done (과 jqXHR 객체의 대응 방법) 또는 사용되지 않는 jqXHR.success()의 옵션 대신 성공/오류/완료 콜백을 사용해야합니다 ? # 1은 oldie에서 작동하고 # 2는 브라우저가 위치 정보 데이터를 가져 오는 동안 깨진 것처럼 보이지 않게합니다. –

+0

내 onload 및 success 콜백 내부에서 함수를 호출하려고했기 때문에 여기가 비어있는 부분입니다. 이 함수는 지오 코드 안에 있었고 위의 지오 코드 함수의 끝 부분에 단순히 논리가있었습니다. 지오 코드 함수는 json obj/data가없는 IE에서 여전히 반환되었으므로 검색 기능이 "위치를 확인할 수 없습니다"라는 경고를 계속 내고있었습니다. 어쩌면 주말에 fiddle/bin 작업을 게시하고 근본적으로 작업 코드를 가리키는 질문을 다시 게시 할 것입니다. –

답변

1

비동기는 비동기입니다. 요청이 완료된 후에 뭔가를하고 싶다면 xdr.onload 함수에 넣어야합니다.

자바 스크립트에는 "대기"기능이 없습니다. 하나를 만들고 변수를 모두 x-miliseconds 확인하려면 setTimeout 루프를 수행 할 수 있습니다. 그러나 그것은이 경우에 (그리고 매우 추악한) 당신에게 도움이되지 않을 것입니다. 경우에는 onerror 및 ontimeout을 사용하여 서버에 문제가 있는지 확인하고 도시가 json에 있는지 확인하는 onload를 사용할 수 있습니다. :

JQuery와 문서 말한다 (그건 그렇고, 비동기 요청의 사용 후 구멍 자바 스크립트/브라우저를 차단 훨씬 더 나은 방법입니다)

xdr.onload = function() { 
json = jQuery.parseJSON(xdr.responseText); 
//check if a city is loaded, go on if true 
}; 
xdr.onerror = function() { 
alert('Unable to determine the location of the city and state you entered'); 
//do whatever u wanna do if something went wrong 
xdr.ontimeout = function() { 
alert('404 Server'); 
//do whatever u wanna do if something went wrong 
} 

나는이 당신이 방법을 찾을 도움이되기를 바랍니다 jQuery를 1.8로

, 비동기의 사용 : 거짓 jqXHR ($ .Deferred) 가되지 않습니다와; 당신은

+0

jQuery 1.8에 관한 마지막 스 니펫은'async : false'가 사용되지 않는다는 것을 의미하지 않는다는 것을 의미합니다. 이는 단순히 약속 인터페이스를 사용할 수 없다는 것을 의미합니다. 아니, 그 '비동기 : 거짓'도 좋은 생각이다. – Alnitak

+0

@Alnitak 네, 할 수 있습니다 .. 슬프게도 자바 스크립트 나쁜 스타일로 요청을 동기화하십시오. – nbar

관련 문제