$ .ajax不在crossdomain urls上返回错误函数

时间:2012-07-20 15:33:00

标签: javascript jquery ajax

我已将此问题隔离在此处:

http://jsfiddle.net/ajkochanowicz/pEnMw/2/

基本上,我尝试在我的脚本中添加一项功能,以便在CDN托管的文件失败时查找本地版本的.js文件。所以在.done或错误或完整中加载该脚本似乎是合适的,但这些都不起作用。

澄清:寻找适用于用户定义的js文件的解决方案,因此测试每个文件中的各个函数是不可行的。

关于这个类似主题的问题已经有很多问题,但我发现的所有问题都是关于让请求工作或处理JSON(P)请求。 :(我对使用.js文件进行错误处理感兴趣。

感谢。

3 个答案:

答案 0 :(得分:3)

无法知道script元素是否无法加载,因此唯一的解决方案是添加超时。

引用jQuery's ajax documentationsettings.error部分):

  

错误(jqXHR,textStatus,errorThrown)

     

[...]

     

注意:不会为跨域脚本和JSONP请求调用此处理程序。

我已更新your fiddle以包含timeout

$.ajax({
    type: "GET",
    url: urlVar,
    dataType: 'script',
    timeout : 5000,
    success: function(data) {
        alert('it worked');
    },
    error: function(xhr, ajaxOptions, thrownError) {
        alert('it did not work');
    },
});

答案 1 :(得分:0)

不会为跨域脚本和JSONP请求调用$.ajax中的错误处理程序。

答案 2 :(得分:0)

一个可以工作的解决方案,假设您想要的库是jquery:

在标题中:

   <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>

在你体内:

   <script>
       window.onload=function(){
          if (!$) { // jquery isn't available even after the window is fully loaded, so the distant loading failed
            var head= document.getElementsByTagName('head')[0];
            var script= document.createElement('script');
            script.type= 'text/javascript';
            script.src= 'myOwnJquery.js';
            script.onload = someCallback; // <- might be usefull
            head.appendChild(script);
          }
      }
   </script>

在此示例中,使用要测试的库的函数替换$

这样做的主要原因是你可以设置一个回调,所以你现在不要尝试做你的库之前无法做的事情。