4

这是我的代码。它尝试加载 Leaflet 库。当我将crossDomain选项转到true时,不会触发错误回调。当我将选项设置为 false 时,会触发错误回调,但无法下载 js,因为它是跨域的。

为什么这么难?有什么解决办法吗?有一个图像占位符而不是网络地图(最初不加载它并节省页面加载时间),当用户激活地图时,应该加载js。但是如果它失败了,我想显示一个正常的错误信息和一个重试按钮。

$.ajax({
    url: 'http://code.leafletjs.com/leaflet-0.3.1/leaflet.js',
    success: start_map,
    error: show_map_error,
    dataType: 'script',
    crossDomain: true
});

更新:我试过complete回调,它也不起作用。

update2:这同样适用于跨域$.getScript(...).fail(...)

4

1 回答 1

6

跨域和 Ajax 真的很烦人。这是一个 JavaScript 问题,而不仅仅是一个 jQuery 问题。

基本上是这样的:当你关闭跨域功能时,错误会触发,因为 jQuery/JavaScript 需要相同的域调用。事实并非如此,因此它失败了。

当您进行跨域调用时,将 crossDomain 设置为 true,由于 JavaScript 的跨域限制,您不会遇到错误。

有一些解决方案(或解决方法)。

第一个,如果您有权访问您正在调用的后端系统,您可以设置(在我的示例 PHP 中)标头以允许跨域调用。(我假设您在这里请求 JSONP?)。当您这样做时,JavaScript 会接受调用,并且不需要跨域技巧。

header('Access-Control-Allow-Origin: http://domain1.com, http://domain2.com'); //whitelist

看这里:跨域xmlhttp

如果您无法访问后端,则需要做一个解决方法,这基本上是 Ajax 调用超时,因为错误函数永远不会触发。然而,这种解决方法非常肮脏,当线路出现故障或互联网速度很慢时,将触发此超时。

$.ajax({
    url: 'http://code.leafletjs.com/leaflet-0.3.1/leaflet.js',
    success: start_map,
    error: show_map_error,
    timeout: 2000, // 2 seconds timeout before error function will be called
    dataType: 'script',
    crossDomain: true
});
于 2012-04-10T18:58:17.240 回答