2

Internet Explorer (IE9) で JSON が機能しないという問題があります。私はウェブをたくさん検索し、さまざまな解決策を試しましたが、何もうまくいかないようです。SO アカウントを作成して、最初の質問をする時が来たと思いました。

JSON と jQuery/AJAX を使用して単純なアップロード進行状況インジケーターを作成しています。インジケーターは Firefox と Chrome で正常に動作します

これは私のビュー関数です:

@never_cache
@admin_required
@render_to("editor/edit_file.html")
def edit_file(request, file_id=None):
    if file_id:
        try:
            file = Document.objects.get(pk=file_id)
            form = DocumentForm(request.POST or None, files=request.FILES or None, instance=file)
        except Document.DoesNotExist:
        form = DocumentForm(request.POST or None, files=request.FILES or None)
    else:
        dir_id = request.GET.get("dir")
        if dir_id:
            try:
                dir = Directory.objects.get(pk=dir_id)
                form = DocumentForm(request.POST or None, files=request.FILES or None, initial ={"directory":dir_id, "available_to":dir.available_to})
            except:
                form = DocumentForm(request.POST or None, files=request.FILES or None)
        else:
            form = DocumentForm(request.POST or None, files=request.FILES or None)

    result = {}
    response = locals()

    if request.method == "POST":
        if form.is_valid():
            file = form.save()
            result["status"] = "ok"
            result["href"] = reverse("portal.editor.views.files_list", args=[file.directory.pk])
            if not request.is_ajax():
                response = HttpResponseRedirect(reverse("portal.editor.views.files_list", args=[file.directory.pk]))
        else:
            result[status] = "error"
        if request.is_ajax():
            response = HttpResponse(json.dumps(result), mimetype="text/plain")
            add_never_cache_headers(response)
    return response

ここに私のjQueryコードがあります:

if ($("#id_edit_form").length > 0) {
    $("#id_edit_form").ajaxForm({
        type: "POST",
        cache: false,
        dataType: "json",
        beforeSubmit:  function (formData, jqForm, options) {
            $("#id_overlay").height($(document).height()).show();
        },
        success: function (response, status, xhr, $form) {
            $("#id_overlay").hide();
            if (status === "success") {
                if (response.status === "ok") {
                    location.href = response.href;
                } else if (response.status === "error") {
                    for (var item in response.form) {
                        $("#id_" + item).parent("p").next("p.js_form-error").html(response.form[item][0]);
                    }
                } else { alert(response.result); }
            } else { alert("Error status:", status); }
        }
    });
}

私はすべてを試したような気がします。また、MIME タイプを「text/plain」に変更しようとしましたが、それでも機能しませんでした。nginxサーバーでDjango 1.3、Python 2.6、およびjQuery 1.6.1を使用しています。

nginx/mime.types の mimetype はどうですか? このファイルに json を追加する必要がありますか? 私はこの問題のために頭を引き裂かれているので、これについて本当に助けが必要です!

前もって感謝します

4

2 に答える 2

0

参考までに、このバグは Django 1.5 にアップグレードしたときに消えました。

django 1.3 には、mimetypes/content-types と JSON にいくつかの問題があったようです (現在、simplejson の代わりに組み込みの json も使用しています)。

于 2013-08-04T22:00:34.103 に答える
0

構文エラーは、おそらく最後の } の後のカンマでした }

success:       function(response, status, xhr, $form){
            $("#id_overlay").hide();
                if( status == "success" ){
                    if( response.status == "ok"){
                        location.href = response.href;
                    }else
                    if(response.status == "error" ){
                        for(var item in response.form){
                            $("#id_"+item).parent("p").next("p.js_form-error").html(response.form[item][0]);
                        }
                    }else
                        alert(response.result);
                }else
                    alert("Error status:", status);
        },

その最後のコンマ。IE はそのようなことについて非常にうるさいです。

あなたが使用している ajaxForm についていくつか読みました。これはhttp://malsup.com/jquery/form/ですか? もっと簡単に使うか、完全に忘れて次のようにjquery ajaxを使うことができるように思えます:

$('a.submit').live('click', function(event){
    event.preventDefault();
    var f = $(this).parents('form');
    data = f.serialize();
    if (contactIsWorking == false){
        $.ajax({
            'type':'POST',
            'url': '/contactform/',
            'data': data,
            'datatype':'json',
            'beforeSend':function(){
                contactIsWorking = true;
            },
            'success':function(data, textStatus){
                postHandler(f, data);
            },
            'error':function(jqXHR, textStatus, errorThrown){

            },
            'timeout':function(data){
            },
            'complete':function(data){
                contactIsWorking = false;
                spinner.fadeOut(500);
            }
        });
    }
});

私のプロジェクトの1つからこのコードをすばやく取得しました-おそらく情報が多すぎますが、必要なものを除外できると思います

于 2012-11-20T20:10:54.757 に答える