2010-09-14 36 views
12

我想上传一个文件,使用“AJAX”,处理文件中的数据,然后返回一些数据到UI,所以我可以动态更新屏幕。jquery ajax表单成功回调不被称为

我正在使用JQuery Ajax表单插件,jquery.form.js在http://jquery.malsup.com/form/找到的JavaScript和在后端使用Django。表单正在提交,后端处理没有问题,但是当从服务器收到响应时,我的Firefox浏览器会提示我下载/打开“application/json”类型的文件。该文件具有我一直试图发送给浏览器的json内容。

我不相信这是如何发送json的问题,因为我在这个应用程序的多个地方使用了模块化的json_wrapper()函数。

这里是后应用于Django模板我的表单的外观:

<form method="POST" enctype="multipart/form-data" action="/test_suites/active/upload_results/805/"> 
    <p> 
    <label for="id_resultfile">Upload File:</label> 
    <input type="file" id="id_resultfile" name="resultfile"> 
    </p> 
</form> 

,你不会看到任何提交按钮,因为我打电话与其他按钮提交在哪里以及正在使用ajaxSubmit会()从jquery.form.js插件。

这里是控制javascript代码:

function upload_results($dialog_box){ 
    $form = $dialog_box.find("form"); 
    var options = { 
      type: "POST", 
      success: function(data){ 
       alert("Hello!!"); 
      }, 
      dataType: "json", 
      error: function(){ 
       console.log("errors"); 

      }, 
      beforeSubmit: function(formData, jqForm, options){ 
        console.log(formData, jqForm, options); 
       }, 
     } 
    $form.submit(function(){ 
     $(this).ajaxSubmit(options); 
     return false; 
    }); 
    $form.ajaxSubmit(options); 
} 

正如你所看到的,我已经得到了渴望看到成功的回调函数的工作,根本就成功创建了一个警报消息。但是,我们从未接到过这个电话。此外,error函数未被调用,并且beforeSubmit函数被执行。

,我找回文件具有以下内容:

{"count": 18, "failed": 0, "completed": 18, "success": true, "trasaction_id": "SQEID0.231"} 

我用“成功”在这里表示服务器是否是能够充分运行post命令。如果失败,结果会如下所示:

{"success": false, "message":"<error_message>"} 

您的时间和帮助是非常感谢。我已经花了几天的时间了,并且很乐意继续前进。

+2

“error”调用是否执行?或'beforeSubmit'?检查萤火虫或铬合金的实际响应也会有所帮助,看看实际回来的是什么。 – 2010-09-14 20:12:53

+0

不,错误调用不会执行,但beforeSubmit会执行。在提交之前,我们也知道一切正常,因为服务器端处理运行正常。 – 2010-09-14 20:19:49

+0

@Michael - 你在萤火虫/镀铬/提琴手网面板上看到了什么反应? – 2010-09-14 20:28:13

回答

3

如果有人有类似的问题,这里是最终的JavaScript我最终使用:

function upload_results_dialog($data_elem){ 
    var $dialog_box = $("#ajax-dialog-box"), 
    data = $data_elem.attr("data"); 
    $.ajax({ 
     url: "../upload/" + data+ "/", 
     success: function(response){ 
      $dialog_box.html(response); 
      $dialog_box.dialog("option", 
       { 
        title: "Upload", 
        height: 260, 
        width: 450, 
        buttons: { 
         Cancel: function(){ 
          $(this).dialog('close'); 
         }, 
         Upload: function(){ 
          upload($(this)); 
         } 
        } 
       } 
      ); 
      $dialog_box.dialog('open'); 
     } 
    }); 
} 
function upload($dialog_box){ 
    var $form = $dialog_box.find("form"), 
     iframe = $dialog_box.find("iframe"), 
     $html = $($iframe.contents()), 
     $iframe_form = $html.find("form"); 
    $iframe_form.html($form.contents()); 

    //Set the onload function 
    $iframe.attr("onload","check_file_uploaded_valid()"); 
    $iframe_form.submit(); 
} 
2

好吧,我刚刚花了几个小时,这个问题一直在逐行浏览js文件。这是工作一秒钟,然后下一个没有。我的问题是 - 我已经删除了结果的目标div。一旦我把它放回去,它工作得很好。

+0

我确认这是真的,从我的理解中解决了我的问题 – stef 2015-02-09 08:58:27

0

你需要调用$('#form-id').ajaxForm();文档准备jQuery的事件,这样的插件注册所有的事件处理程序。

+0

,$ form.ajaxSubmit()应该调用事件(通过传递需要的事件处理程序)。 – 2011-05-23 04:08:45

+2

如果您在目标表单上调用ajaxSubmit而不使用ajaxForm,则处理程序不会绑定。我可以说这是因为两天前我有这个问题。 – 2011-05-23 17:40:17

2

发生在我身上。问题原来是服务器没有将整个对象转换为适当的JSON。将返回值更改为仅我需要的属性:

return Json(new {Id = group.Id, Name = group.Name});