【问题标题】:jQuery doesn't fire error callback with cross-domain scriptjQuery 不会使用跨域脚本触发错误回调
【发布时间】:2012-04-23 00:34:03
【问题描述】:

这是我的代码。它尝试加载 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(...)

【问题讨论】:

    标签: ajax jquery cross-domain


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 2012-12-19
      • 2013-01-25
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      相关资源
      最近更新 更多