jQuery绑定ajax:成功地不在rails3app中为新创建的(ajax)项工作
jQuery bind ajax:success not working in rails 3 app for newly created (ajax) items
**编辑这篇文章是因为我发现问题实际上在于rails无法绑定到ajax:success函数。
***使用轨道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事件。
它确实会在单击时从数据库中删除数据,但.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();
});
如果我将其更改为绑定到点击函数,它会起作用,但这并不能解释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事件?任何方向都将不胜感激!
附言:删除方法的控制器如下,以防任何人都能检测到问题:
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(rendernothing:true)是成功/完成的。这意味着您应该在控制器中返回一个空的JSON对象。
respond_to do |format|
format.json { render: {}.to_json }
end
通过捕获ajax:completed
检查是否出现解析错误(或类似错误)。检查那里的status
参数。在我的案例中,由于mimetype不匹配,它是一个parseerror
。
您也可以在jquery_ujs.js
中设置断点。
另请参阅此问题jQuery ajax请求未触发JS响应
对我来说,这是因为我们使用的是slim,模板是"name.slim"。如果我们将它们更改为"name.slam.html",则ajax:成功将正确启动。
我使用的解决方案是将格式添加到控制器中的呈现声明中。
所以我们有这样的东西:
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
});
- 使用JSTree上下文菜单捕获新创建的节点
- 如何在新创建的模块中从Odoo v8中的Javascript文件中调用python函数
- 更新脚本以针对具有递增 ID 的新创建的表行运行
- AJAX 重新创建手风琴并打破它们
- 从返回的数据 ajax post 创建一个变量
- Ajax/php创建了一个数组——如何以.txt的形式下载给用户
- 我应该在原型上还是在新创建的实例上调用构造函数方法
- 访问新创建的Facebook事件返回false
- 新创建的按钮(通过createElement(“button”))激活自身.如何阻止这种情况
- 如何以ajax形式创建回调
- jQuery:如何将事件附加到类内新创建的元素
- 角度1:为新创建的对象添加新ID
- jQuery绑定ajax:成功地不在rails3app中为新创建的(ajax)项工作
- 如何设置新创建的 DOM 元素的 HTML 内容
- Chrome 扩展程序:如何将 HTML 附加到新创建的 Chrome 标签页
- 无法使用角度删除新创建的行.js
- 在 Ajax 中创建 RoR 链接 在 .js.erb 文件中调用
- 如何在 EXTJS 的 AJAX 中创建新窗口
- JQuery和Ajax调用新创建的元素
- prestashop-使用ajax onclick创建新表单