Javascript Backbone.js won';不进行跨主机请求?

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

我一直在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.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);
   }
 });