jQuery绑定ajax:成功无法在rails 3应用程序中为新创建的(ajax)项目工作

**编辑这篇文章是因为我发现问题实际上是无法将rails绑定到ajax:success函数。

***使用rails 3.2.3

感谢您抽出宝贵时间阅读并尝试提供帮助。

我在ajax上添加了一个简单的淡出function:正在删除的项目成功,如下所示:

$(document).ready( jQuery(function($) { $('.delete').bind('ajax:success', function() { $(this).closest('div').fadeOut(); }); })); #For some reason had to pass the $ into the function to get it to work, #not sure why this is necessary but doesn't work unless that is done. 

在此之后,我想在用户添加内容时使用不显眼的jQuery创建一个对象,并在这些对象上也有工作删除按钮。 我创建了一个在创建新项目后调用的create.js.erb文件 – 并且创建工作正常,但删除按钮无法访问ajax:success事件。

单击时它会从数据库中删除数据,但.fadeOut永远不会绑定到它,因此它不会消失。 create.js.erb如下:

 #$("div").append(html) here, then call the function below to try and bind the ajax:success function $('.delete').bind('ajax:complete', function() { $(this).closest('div').fadeOut(); }); 

如果我将其更改为绑定到click函数,则可以正常工作,但这并不能解决失败的ajax调用:

 #$("div").append(html) here, then call the function below to try and bind the ajax:success function $('.delete').bind('click', function() { $(this).closest('div').fadeOut(); }); 

所以必须要有一些东西与ajax绑定:在创建项目后成功。 你们知道为什么会这样吗? 我是否需要在rails中执行一些特殊操作以使新呈现的项目识别ajax事件? 任何方向将不胜感激!

PS删除方法的控制器如下所示,以防任何人可能在那里检测到问题:

 def destroy @user = User.find(params[:user_id]) @item = @user.item.find(params[:id]) @item.destroy respond_to do |format| format.html { redirect_to user_path(@user) } format.json { head :no_content } format.js { render :nothing => true } end end 

问题听起来像绑定发生在元素生成之前。 试试这个:

 $(document).on('ajax:success', '.delete', function(e) { $(e.currentTarget).closest('div').fadeOut(); }); 

我遇到了同样的问题,因为我的表单处理程序方法返回了一个纯字符串。 一定要渲染jQuery可以处理的东西:

 def handle_form ... render :json => {:what => 'ever'} # or render :nothing => true end 

我最近使用Rails 3.2.3做了类似的事情。 我也用

 $('#dialog-form').bind('ajax:success', function() { }) 

它工作得很好……

虽然这是一个老问题,但我有一个更新的答案,可以解决同样的问题。

从版本1.9开始,jQuery将不再考虑空的repsonse(渲染无效:true)成功/完成。 这意味着在您的控制器中,您应该返回一个空的JSON对象。

respond_to do |format| format.json { render: {}.to_json } end

通过捕获ajax:completed检查是否出现解析错误(或类似错误)。 检查那里的status参数。 在我的情况下,由于mimetype不匹配,这是一个parseerror

您还可以在jquery_ujs.js设置断点。

另见这个问题jQuery ajax请求不会触发JS响应

对我而言,这是因为我们使用的是苗条,模板是’name.slim’。 如果我们将它们更改为’name.slim.html’,则ajax:success会正确触发。

我使用的解决方案是将格式添加到控制器中的render声明中。

所以我们有这样的事情:

 render :new, layout: false, formats: [:html] 

即使这是一个老问题,没有一个答案真的帮助了我,因为我有一个自定义确认对话框和ajax:成功触发完全不同的元素。

在这种情况下,为了找到你的ajax对哪个元素进行了分解,你可以先使用代码:

 $(document).on('ajax:success', 'a', function(evt, data, status, xhr) { $( ".log" ).text( "Triggered ajaxComplete handler." ); // Check what is the value of $(this), and you will see what button has triggered the ajax success action, and you can start from there });