gpt4 book ai didi

javascript - 模拟*同步* XDomainRequest (XDR) 请求的任何方式

转载 作者:行者123 更新时间:2023-11-29 15:41:18 28 4
gpt4 key购买 nike

我们正在对 google maps geocode 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;
};

如果我在地理编码函数中注释掉 alert(json),我会在 IE8 中得到结果,因为这是一个阻塞操作,所以请求有时间完成并填充我的 json 对象。在未注释的情况下运行时,不会填充 json 对象。

有人知道如何在 IE 中使用它吗?

最佳答案

异步就是异步。如果你想在请求完成后做一些事情,你必须把它放到 xdr.onload 函数中。

javascript 中没有“等待”函数。您可以构建一个并执行一个 setTimeout 循环来检查所有 x 毫秒的变量。但这在这种情况下对您没有帮助(而且非常丑陋)。在您的情况下,您可以使用 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 文档说:

As of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated; you must use the success/error/complete callback options instead of the corresponding methods of the jqXHR object such as jqXHR.done() or the deprecated jqXHR.success()

关于javascript - 模拟*同步* XDomainRequest (XDR) 请求的任何方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18541977/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com