Django IE中fetch()的Backbone.js问题

Django IE中fetch()的Backbone.js问题,django,internet-explorer,backbone.js,fetch,Django,Internet Explorer,Backbone.js,Fetch,我正在构建一个web应用程序,后端是Django,前端是Backbone.js 当我试图从服务器获取数据时,IE出现问题。当我在IE中运行HTML页面时,集合获取总是调用error func 我的代码: $(function(){ var Chapter = Backbone.Model.extend({}); var Chapters = Backbone.Collection.extend({ model: Chapter, url: 'http://ip.olya.iv

我正在构建一个web应用程序,后端是Django,前端是Backbone.js

当我试图从服务器获取数据时,IE出现问题。当我在IE中运行HTML页面时,集合获取总是调用error func

我的代码:

$(function(){

var Chapter = Backbone.Model.extend({});

var Chapters = Backbone.Collection.extend({
    model: Chapter,
    url: 'http://ip.olya.ivanovss.info/chapters'
});

var chapters = new Chapters();

var Router = new (Backbone.Router.extend({
    routes: {
        "": "choose_activity",
        "/": "choose_activity"
    },

    choose_activity: function () {
        chapters.fetch({
            success: function () {
                AppView.render();
            },
            error: function() {
                alert('error');
            }
        });
    }
}))();

var AppView = new (Backbone.View.extend({
    el: '.popup',
    templates: {
        choose_activity: Handlebars.compile($('#tpl-activities').html())
    },
    render: function () {
        this.$el.html(this.templates["choose_activity"]({ chapters: chapters.toJSON()}));
    }
}))();

Backbone.history.start();
});
Django的观点:

def chapters(request):
    chapters = list(Chapter.objects.order_by('id'))
    response = HttpResponse(json.dumps(chapters, default=encode_myway), mimetype='text/plain')
    if request.META.get('HTTP_ORIGIN', None) in ('http://localhost', 'http://html.olya.ivanovss.info', 'http://10.0.2.2'):
        response['Access-Control-Allow-Origin'] = request.META['HTTP_ORIGIN']
    return response

提前感谢

IE7不支持CORS

有两种方法可以解决这个问题。简单的方法是通过API代理。我的Python已经过时了(我是Node/PHP开发人员),但我确信关于如何做到这一点的资源非常丰富。这样做的好处是您不必接触API。但这意味着您的本地服务器必须卷曲并返回来自API服务器的每个请求

第二种(也是更少的服务器密集型方式)是JSONP!JSONP的思想是,它使用您指定的URL将
附加到文档中。jQuery追加一个
?callback=jquerynn
,其中
NNN
是一个随机数。因此,当
加载时,它会调用
jquerynn(“响应文本”)
,jQuery知道从那里解析响应。这样做的坏处在于,您必须将所有响应包装在API端(如果您刚刚开始,这非常容易,如果您已经构建了基础设施,这就不那么容易了)

JSONP令人恼火的地方在于,从本质上讲,您不能执行POST/PUT/DELETE。但如果您可以访问API,则可以模拟它:

Backbone.emulateHTTP = true;

model.save();  // POST to "/collection/id", with "_method=PUT" + header.
将JSONP与主干网集成非常简单(little secret Branche.sync使用jQuery的
$.ajax()
,选项参数转发给jQuery;)

对于访问交叉原点的每个模型/集合,您可以添加一个su

var jsonpSync = function (method, model, options) {
    options.timeout = 10000; // for 404 responses
    options.dataType = "jsonp";
    return Backbone.sync(method, model, options);
};
在每个集合和模型中,什么是跨原点的:

var MyCollection = Backbone.Collection.extend({
    sync  : jsonpSync
});
或者只是覆盖整个主干同步

Backbone.__sync = Backbone.sync;

var jsonpSync = function (method, model, options) {
    options.timeout = 10000; // for 404 responses
    options.dataType = "jsonp";
    return Backbone.__sync(method, model, options);
};

Backbone.sync = jsonpSync;
在服务器端,您可以执行以下操作:返回JSONP响应(复制粘贴到此处):


哪一个?IE8和IE9仅以非标准方式(如所述)支持CORS谢谢,您的信息帮助解决了IE8中的问题。也许有一种方法可以让它在IE7中工作?也许有一些有用的提示。
def randomTest(request):
    callback = request.GET.get('callback', '')
    req = {}
    req ['title'] = 'This is a constant result.'
    response = json.dumps(req)
    response = callback + '(' + response + ');'
    return HttpResponse(response, mimetype="application/json")