我正在尝试读取远程文件;我正在使用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)文件?
答案 0 :(得分:1)
您的问题是 Same Origin Policy 之一,它存在于大多数AJAX请求中,并作为安全措施实施。如果您查看jqXHR()
,则可以看到readyState
为0
,表明了这一点。请注意,当请求失败时,readyState
始终为0
,无论是针对策略限制还是格式错误的请求。 error
消息为空,因为这些限制阻止了错误消息本身的触发。
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;
为了解决这个问题,有许多插件,列在this answer中。它还指出:
解决此问题的最佳方法是在后端创建自己的代理,以便您的代理将指向其他域中的服务,因为在后端不存在相同的源策略限制。
但是,假设您无法做到这一点,最简单的方法是使用 CORS Anywhere proxy ,如下面的代码段所示(请注意,结果需要虽然来了):
$.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;
希望这有帮助! :)