Javascript Backbone.js won';不进行跨主机请求?
我一直在Chrome控制台上玩主干网游戏,遇到了一个我无法解决的跨域问题 我连接的主机可能正确地实现了CORS,因为原始XHR请求返回预期的JSON:Javascript Backbone.js won';不进行跨主机请求?,javascript,google-chrome,backbone.js,cross-domain,Javascript,Google Chrome,Backbone.js,Cross Domain,我一直在Chrome控制台上玩主干网游戏,遇到了一个我无法解决的跨域问题 我连接的主机可能正确地实现了CORS,因为原始XHR请求返回预期的JSON: var http = new XMLHttpRequest(); http.open('GET', 'http://example.com:3000/entities/item/15.json', true); http.onreadystatechange = function(evt) { console.log(evt); } http.s
var http = new XMLHttpRequest();
http.open('GET', 'http://example.com:3000/entities/item/15.json', true);
http.onreadystatechange = function(evt) { console.log(evt); }
http.send();
(使用响应中的正确数据在控制台上记录3个XHR进度事件)
但当我使用主干网执行以下操作时,浏览器不喜欢它:
var Item = Backbone.Model.extend({});
var ItemsCollection = Backbone.Collection.extend({
model: Item,
url: 'http://example.com:3000/entities/item/'
});
var items = new ItemsCollection();
items.fetch();
(返回XMLHttpRequest无法加载。)http://example.com:3000/entities/item/. 起源http://localhost:8000 访问控制允许源站不允许使用。
)
我需要做些什么来告诉主干与CORS合作?这个错误似乎是在浏览器发出请求之前出现的,所以我认为这不是服务器配置错误。我希望其中一个有帮助(我还没有尝试):1. 二,
事实证明,我用主干网请求的URL与通过XHR请求的URL略有不同(它们缺少一个查询码)。这导致服务器运行到500,但没有CORS头。Chrome在调试面板的网络选项卡中根本没有显示HTTP请求,所以我非常困惑
修复服务器上的500使这项功能再次发挥作用。嘿,您可以使用以下功能:
var PostsCollection = Backbone.Collection.extend({
initialize: function(models, options) {
//this.id = options.id;
},
url: 'http://myapi/api/get_posts/?count=8',
});
posts = new PostsCollection();
posts.fetch({
dataType: 'jsonp',
success : function (data) {
console.log(data);
}
});
关键是我们需要使用“jsonp”你可以在Chrome中禁用同源策略,解释了如何在Chrome上禁用它。谢谢你的提示,但我不想禁用它(这是为在常规web浏览器上运行而设计的)。然后可能会有帮助。是的,正如我在问题中所说,CORS在服务器端运行良好,因为浏览器能够使用标准的XMLHttpRequest发出请求。
xhrFields。如果您进行同步AJAX调用,withCredentials
将在Firefox中崩溃,例如在呈现之前加载模板。幸运的是,我的模板位于同一个域中,因此我可以将上述内容包装在if(originalOptions.async!==false)
block我应该在哪里添加同步方法更新?在backbone.js或我的脚本中?
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
options.crossDomain ={
crossDomain: true
};
options.xhrFields = {
withCredentials: true
};
});
var PostsCollection = Backbone.Collection.extend({
initialize: function(models, options) {
//this.id = options.id;
},
url: 'http://myapi/api/get_posts/?count=8',
});
posts = new PostsCollection();
posts.fetch({
dataType: 'jsonp',
success : function (data) {
console.log(data);
}
});