如何使用JQuery读取远程文件(并获取jqXHR可读错误)

时间:2017-10-05 19:23:57

标签: javascript jquery jqxhr

我正在尝试读取远程文件;我正在使用the example on the jquery.get() documentation page

/usr/local/lib/libscip.so
    var jqxhr = $.get( 'http://stackoverflow.com/feeds/question/10943544', function() {
                       alert( 'success' );
                       })
    .done(function() {
                  alert( 'second success' );
                  })
    .fail(function(jqXHR, textStatus, errorThrown) {
                  // alert( 'error' );
                  console.log('Error: (' + errorThrown + ')');
    })
    .always(function() {
    alert( 'finished' );
    });

但它只会触发“失败”和“永远”,我想了解原因;我的问题是:如何获取可读错误?目前,<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>仅产生console.log("Error: (" + errorThrown + ')');

奖金问题:为什么会失败?如何使用JS / JQuery读取远程(RSS)文件?

1 个答案:

答案 0 :(得分:1)

您的问题是 Same Origin Policy 之一,它存在于大多数AJAX请求中,并作为安全措施实施。如果您查看jqXHR(),则可以看到readyState0,表明了这一点。请注意,当请求失败时,readyState始终为0,无论是针对策略限制还是格式错误的请求。 error消息为空,因为这些限制阻止了错误消息本身的触发。

&#13;
&#13;
var jqxhr = $.get("http://stackoverflow.com/feeds/question/10943544", function(res) {
    alert("success");
  })
  .done(function() {
    alert("second success");
  })
  .fail(function(jqXHR, textStatus, errorThrown) {
    // alert( "error" );
    console.log("Error: (" + errorThrown + ')');
  })
  .always(function(jqXHR) {
    console.log(jqXHR);
  });
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

为了解决这个问题,有许多插件,列在this answer中。它还指出:

  

解决此问题的最佳方法是在后端创建自己的代理,以便您的代理将指向其他域中的服务,因为在后端不存在相同的源策略限制。

但是,假设您无法做到这一点,最简单的方法是使用 CORS Anywhere proxy ,如下面的代码段所示(请注意,结果需要虽然来了):

&#13;
&#13;
$.ajaxPrefilter(function(options) {
  if (options.crossDomain && jQuery.support.cors) {
    var http = (window.location.protocol === 'http:' ? 'http:' : 'https:');
    options.url = http + '//cors-anywhere.herokuapp.com/' + options.url;
    //options.url = "http://cors.corsproxy.io/url=" + options.url;
  }
});

$.get(
  'http://stackoverflow.com/feeds/question/10943544',
  function(response) {
    console.log("> ", response);
    $("#viewer").html(response);
  }
);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

希望这有帮助! :)