10

我有一个通过 AJAX 提交表单的表单:remote => true。查看服务器日志和 FireBug,我得到响应 200 OK,它以以下形式返回 JSON:

{ "email": "test@test.com"}

然后我有这两个处理程序:

$('#new_invitation').bind("ajax:success", function(event, data, status, xhr) {
    alert('test');
});

$('#new_invitation').bind("ajax:error", function() {
    alert('error');
});

即使我得到一个 200OK,它也是触发的错误处理程序。我唯一一次设法使成功处理程序工作是当我发送一个标头中包含 200 的空响应时。

我不知道为什么这不起作用:-S

编辑 1------------ 进行这些更改后:

$('#new_invitation').bind("ajaxSuccess", function(event, data, status, xhr) {
    alert('test');
});

$('#new_invitation').bind("ajaxError", function(jqXHR, textStatus, errorThrown) {
alert('error');
    console.log(jqXHR.responseText);
    console.log(textStatus.responseText);
    console.log(errorThrown.responseText);
});

我仍然遇到同样的错误。日志内容给了我:

undefined
my_email@test.com
undefined

这是表单的代码(标准 Rails 的东西):

<%= form_for @shoot.invitations.new, :url=>shoot_invitations_path(@shoot), :remote => true, :html => {:class => 'form-inline'} do |f| %>
    <%= f.text_field :email, :'placeholder' => 'ex: test@test.com' %>
    <%= f.text_field :role, :'placeholder' => 'ex: Photographer' %>
    <%= f.submit "Invite", :class => 'btn btn-success' %>
<% end %>

编辑 2 ---------

我做了一些更改,现在看来我的错误是解析错误。我不明白,因为这是我从服务器返回的 JSON(data.responseText),看起来一切都很好:

{"email":"zxxczxc@test.com"}

回答 --------- 当我将 :'data-type' => :json 放入表单选项时,我设法让一切正常。我之前尝试过,但没有成功,因为我把它放在 form_tag 选项而不是 html 选项中......

4

5 回答 5

18

如果服务器返回的不是有效的 JSON,例如单个空格,jQuery 将生成一个解析错误并认为它是一个失败的请求,即使状态码是 200。

从 jQuery 1.9 开始,当类型设置为 JSON 时,一个完全空的响应被认为是一个失败的请求,因为空字符串是无效的 JSON。请参阅http://jquery.com/upgrade-guide/1.9/#jquery-ajax-returning-a-json-result-of-an-empty-string

于 2013-01-08T22:44:23.407 回答
8
  1. 检查 $.ajax 的数据类型是否设置为 jsonp

  2. 尝试回复{电子邮件:"ahsgah@ahsgh.com"}

于 2012-06-01T00:56:54.473 回答
2

JSON.parse('') 抛出错误。对我来说,这很愚蠢,它应该返回未定义。我将此代码添加到我的应用程序

#HACK JSON.parse('') should return undefined, not throw an error
_parse = JSON.parse
JSON.parse = (str) =>
  unless str == ''
    _parse.apply JSON, arguments

或者对于不使用咖啡脚本的穷人(未经测试)

//HACK JSON.parse('') should return undefined, not throw an error
var _parse = JSON.parse
JSON.parse = function(str) {
  if (str !== '')
    return _parse.apply(JSON, arguments);
  else
    return undefined;
}
于 2013-02-01T22:01:56.573 回答
1

使用ajaxSuccess而不是ajax:success,而ajaxError不是ajax:error为您的事件类型。

见这里:http ://docs.jquery.com/Ajax_Events

于 2012-05-31T19:22:30.217 回答
0

(在 Rails 5.2 和 jQuery 2 上)我花了一个小时并排比较两位 UJS 代码无济于事:两者都返回类似格式的 Javascript 函数调用(以更新前端),状态为 200 但一个触发ajax:error,另一个不触发。我能够通过在application.js清单中从jquery_ujs切换到rails-ujs来消除这个问题:

//= require jquery2
// require jquery_ujs  # Removed this by taking away '='
//= require rails-ujs

注意连字符与下划线!

现在两个调用的行为方式相同(正确)。我希望这对其他人有帮助。

于 2019-02-01T12:29:06.163 回答