【问题标题】:jquery ajax form success callback not being calledjquery ajax表单成功回调未被调用
【发布时间】:2011-04-12 08:48:01
【问题描述】:

我正在尝试使用“AJAX”上传文件,处理文件中的数据,然后将部分数据返回到 UI,以便我可以动态更新屏幕。

我正在使用 JQuery Ajax 表单插件,在 http://jquery.malsup.com/form/ 找到的 jquery.form.js 用于 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>

您不会看到任何提交按钮,因为我在其他地方使用按钮调用提交,并且正在使用 jquery.form.js 插件中的 ajaxSubmit()。

这里是控制 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>"}

非常感谢您的时间和帮助。我已经在这方面花了几天时间,很想继续前进。

【问题讨论】:

  • error 调用是否执行?还是beforeSubmit?检查 firebug 或 chrome 中的实际响应也会有所帮助,以了解实际返回的内容。
  • 不,错误调用不会执行,但 beforeSubmit 会执行。我们还知道在提交之前一切正常,因为服务器端处理运行正常。
  • @Michael - 您在 firebug/chrome/fidler 网络面板中看到了什么响应?
  • @Nick - [Object { name="resultfile", more...}] [form /test_su...lts/805/] Object { url="/test_suites/active/upload_results/ 805/",更多...} 这些元素中的每一个都是可切换的(我正在使用 Firebug btw)哦,为了澄清起见,上面的所有代码基本上都是从头开始编码的。没有剪切和粘贴,以防万一。
  • @Michael - 你能在你的问题中发表完整的回复吗?这似乎不是有效的 JSON,这会导致解析器失败。

标签: jquery django forms file-upload


【解决方案1】:

好的,我刚刚花了几个小时处理同样的问题,逐行浏览 js 文件。它工作了一秒钟,然后下一秒钟就没有了。我的问题是 - 我删除了结果的目标 div。一旦我把它放回去,它就可以正常工作了。

【讨论】:

  • 我确认这是真的,解决了我的问题
【解决方案2】:

如果有人遇到类似问题,这是我最终使用的最终 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();
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您需要在文档就绪 jQuery 事件中调用 $('#form-id').ajaxForm();,以便插件注册所有事件处理程序。

      【讨论】:

      • 据我了解,$form.ajaxSubmit() 应该调用事件(通过传递对事件处理程序的需求)。
      • 如果在目标表单上调用没有 ajaxForm 的 ajaxSubmit,则处理程序不会绑定。我可以这么说,因为我两天前遇到了这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2023-03-08
      • 2023-03-19
      • 1970-01-01
      • 2013-02-14
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多