任何模拟* synchronous * XDomainRequest(XDR)请求的方法

时间:2013-08-30 21:51:39

标签: javascript jquery json synchronous xdomainrequest

我们正在对Google地图地理编码API进行跨域调用。在现代浏览器中,这一切都很好用,但它在IE8中根本不起作用。看起来它也会在IE9中失败(部分CORS支持)。这导致包括XDomainRequest(XDR)来处理IE8-9。这样做在我的独立测试中运行良好,可以在IE8中恢复数据。

我现在遇到的问题是XDR只能异步工作,所以我的地理编码函数会在我的xdr.onload触发之前返回。

在我的搜索功能中,我调用地理编码功能:

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

我正在IE8上面点击“无法确定位置”警告。

这是我的地理编码功能:

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;
};

如果我在地理编码功能中注释掉警报(json),我会在IE8中得到我的结果,因为这是一个阻塞操作,因此请求有时间完成并填充我的json对象。当它取消注释运行时,不会填充json对象。

任何人都有任何想法如何让我在IE中工作?

1 个答案:

答案 0 :(得分:1)

asynchron是异步的。如果您想在请求完成后执行某些操作,则必须将其放入xdr.onload函数中。

没有"等待"在javascript中的功能。你可以构建一个并执行一个setTimeout循环来检查所有x-miliseconds的变量。但在这种情况下,这对你没有帮助(而且非常难看)。 在您的情况下,您可以使用onerror和ontimeout来检查服务器是否有问题,并使用onload来检查城市是否在json中。

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
}

我希望这可以帮助您找到方法(顺便说一下,使用异步请求是一种更好的方法,然后阻止漏洞javascript /浏览器;)

jQuery doc说:

  

从jQuery 1.8开始,使用async:false和jqXHR($ .Deferred)   已弃用;您必须使用success / error / complete回调   选项而不是jqXHR对象的相应方法   作为jqXHR.done()或不推荐使用的jqXHR.success()