jQuery ajaxForm返回.json文件

我在rails中有一个模型创建表单,我也通过ajax返回JSON。 到目前为止我的代码看起来像:

$('#new_stem').ajaxForm({ //#new_stem is my form dataType: 'json', success: formSuccess }); function formSuccess(stemObj) { //does stuff with stemObj } 

我有一个带有文件上传器的多部分表单(但我不确定这是否相关)。

当我提交表单时,它工作正常(我的模型正确创建并呈现为json),但是不是由formSuccess函数处理的json,而是提示下载“stems.json”(我的词干创建的路径)动作)在Firefox中。

会导致这种情况发生的原因,以及可以解决的问题是什么? 不确定这是否是问题的一部分,但我的表单中没有提交按钮,我有一个链接,点击处理程序调用$(’#new_stem).submit()

多谢你们!

编辑:Firebug告诉我标题包含以下内容:

 Etag "b53e5247e7719cf6b1840e2c6e68781c" Connection Keep-Alive Content-Type application/json; charset=utf-8 Date Mon, 03 May 2010 02:19:31 GMT Server WEBrick/1.3.1 (Ruby/1.8.7/2010-01-10) X-Runtime 241570 Content-Length 265 Cache-Control private, max-age=0, must-revalidate 

加上一个cookie标题

为防止浏览器触发.json文件集下载内容类型标题为“text / html”。

PHP:

 header("Content-type: text/html"); 

ASP.NET MVC:

 return Json(obj, "text/html"); 

在javascript中你需要解析文本结果,如下所示:

 $(".addform").ajaxSubmit({ url: "file.php", type: "POST", dataType: "text", iframe: true, success: function (text) { var data = $.parseJSON(text); }, error: function (xmlRequest, textStatus, errorThrown) { alert(errorThrown); } }); 

完美的工作。

此插件允许您使用ajax提交MultiPart Forms。

如果您想使用Ajax’success:’选项,您必须使用ajax提交表单。 目前您正在使用submit()函数,它基本上只是以传统方式提交表单。 您可以将json数据视为下载文件或浏览器,这意味着这种情况正在发生。

您需要使用该插件(如果您需要multipart函数 – 否则只需使用常规Ajax函数)

使用该插件,您可以像这样使用它:

 $("#SubmitButton").click(function(){ $.ajaxFileUpload( { url:serverurl, secureuri:false, fileElementId:elementId, dataType: 'json', success: function (data, status) { /* show success message */ }, error: function (data, status, e) { /* handle error */ } }); }); 

如果您想在没有文件上传的情况下执行此操作,则可以使用更简单的方法。

 $("#SubmitButton").click(function(){ $.post('YOUR_URL', $("#FormName").serialize(), function(data){ alert(data.name); // John }, "json"); //specify return data is going to be json }); 

虽然不是我想要解决的问题,但我能够找到一个与我的需求略有不同的解决方案!

由于ajax文件上传是通过iframe完成的,问题是在iframe加载.json文件后,它被Firefox解释为下载并打开了下载提示。 我很确定我可以使用一些服务器设置来防止这种情况,但我已经有足够的时间进入这个。

所以我所做的是将输出呈现为文本而不是json,因为我只是真的钓了一个id号。 我的代码现在看起来像:

 $(document).ready(function() { $('#continue-upload').click(function() { $('#new_stem').ajaxSubmit({ dataType: 'text', //'json', success: formSuccess }); }); }); 

我需要的身份证号码也包含在预标签中,因此我需要在结果函数中删除它们。

这就是我现在想要的,喔!

实际上该插件的ajaxSubmit代码有点hacky。 要使ajaxSubmit起作用(在编写本文时),您的服务器必须将JSON数据作为content-type = text / html返回。 该插件将自动拉出<\ pre>标签等(参见源代码)。 我猜当他们试图让隐藏的iframe拉回json时,他们决定将json视为一个文本并将其从iframe中解析出来。

听起来好像它的Content-Type响应头不正确,因此浏览器不知道如何处理它。 它应该是application/json 。 您可以使用Firebug的Net面板来确定实际的响应标头。

您是否取消了submit事件的默认操作? 听起来这个表单实际上是提交的(在传统意义上 – 换句话说,Firefox实际上是导航到表单action指定的页面)。

也许有帮助

 $('#cpFileUpload').ajaxForm({ dataType: 'html', success: function(data) { eval(data); if (data.result == false) { alert('error on server side'); } else { // do what you want } } }); 

在服务器端,输出必须是这样的(只有这个输出或身体标签内没有任何其他文本)

 var data = {result: true, html: 'ok'} 

不太好,但工作

简单的方法:

$('#new_stem').ajaxForm({ dataType: 'text', complete: function(xhr) { data = JSON.parse(xhr.responseText); } });