这是我的代码。它试图加载Leaflet库。当我将crossDomain
选项转到true
时,不会触发错误回调。当我将该选项设置为false时,会触发错误回调,但它无法下载js,因为它是跨域的。
为什么这么难?这有什么解决方案吗?有一个图像占位符而不是Web地图(最初不加载它并节省页面加载时间),当用户激活地图时,应加载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(...)
。
答案 0 :(得分:6)
Crossdomain和Ajax时不时都很烦人。这是一个JavaScript问题,而不仅仅是一个jQuery问题。
基本上是这样的:当您关闭跨域功能时,错误将触发,因为jQuery / JavaScript需要相同的域调用。情况并非如此,因此失败了。
当您进行跨域调用,并且crossDomain设置为true时,由于JavaScript的跨域限制,您将不会遇到错误。
有一些解决方案(或解决方法)。
首先,如果您有权访问正在调用的后端系统,则可以设置(在我的示例中为PHP)标头以允许跨域调用。 (我假设你在这里请求JSONP?)。执行此操作时,JavaScript接受调用,并且不需要跨域技巧。
header('Access-Control-Allow-Origin: http://domain1.com, http://domain2.com'); //whitelist
请看这里:Cross domain 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
});