**编辑这篇文章,因为我发现问题实际上是无法将rails绑定到ajax:success函数。
***使用rails 3.2.3
感谢您花时间阅读并尝试提供帮助。
我在ajax上添加了一个简单的淡出功能:正在删除的项目成功,如下所示:
$(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事件。
单击时会从db中删除数据,但.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事件?任何方向都会非常感激!
P.S。删除方法的控制器如下所示,以防任何人可能在那里检测到问题:
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
答案 0 :(得分:18)
问题听起来像是在生成元素之前发生了绑定。试试这个:
$(document).on('ajax:success', '.delete', function(e) {
$(e.currentTarget).closest('div').fadeOut();
});
答案 1 :(得分:12)
我遇到了同样的问题,因为我的表单处理程序方法返回了一个纯字符串。一定要渲染jQuery可以处理的东西:
def handle_form
...
render :json => {:what => 'ever'}
# or
render :nothing => true
end
答案 2 :(得分:1)
我最近使用Rails 3.2.3做了类似的事情。我也用
$('#dialog-form').bind('ajax:success', function() {
})
它工作正常......
答案 3 :(得分:1)
尽管这是一个老问题,但我有一个更新的答案可以解决同样的问题。
从版本1.9开始,jQuery将不再考虑空的repsonse(渲染无效:true)成功/完成。这意味着在您的控制器中,您应该返回一个空的JSON对象。
respond_to do |format|
format.json { render: {}.to_json }
end
答案 4 :(得分:0)
通过捕获ajax:completed
检查您是否收到解析错误(或类似错误)。检查那里的status
参数。在我的情况下,由于mimetype不匹配,它是parseerror
。
您还可以在jquery_ujs.js
中设置断点。
答案 5 :(得分:0)
对我而言,这是因为我们使用的是瘦身,模板是'name.slim'。如果我们将它们更改为'name.slim.html',则ajax:success会正确触发。
我使用的解决方案是将格式添加到控制器中的渲染声明中。
所以我们有这样的事情:
render :new, layout: false, formats: [:html]
答案 6 :(得分:0)
即使这是一个老问题,没有一个答案真的帮助了我,因为我有一个自定义确认对话框和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
});