Rails远程表单回调ajax:加载不会触发,其他人则执行

时间:2011-05-14 19:08:59

标签: jquery ruby-on-rails ajax

这是我的代码:

$('#fb_login_form').bind('ajax:loading', function() {alert("loading!");});
.bind('ajax:success', function(data, status, xhr) {alert("success!");})
.bind('ajax:failure', function(xhr, status, error) {alert("failure!");})
.bind('ajax:complete', function() {alert("complete!");});

ajax:successajax:complete点火,我看到了两个警报。 ajax:loading没有。

我使用的是jQuery而不是原型。为什么呢?

3 个答案:

答案 0 :(得分:9)

请使用以下链接

更正您的ajax事件方法名称

http://docs.jquery.com/Ajax_Events

答案 1 :(得分:5)

@ user531065实际上是正确的,Rails 3实现了自己的回调名称。它是在rails.js(Prototype)或jquery_ujs.js(jQuery)驱动程序中实现的。这两个驱动程序在使AJAX链接和表单不引人注目时扮演javascript角色。

我正在将Rails 2.3应用程序迁移到Rails 3并遇到类似的问题,回调没有触发。

要注意的一件事是,如果你正在使用Prototype驱动程序,请使用Prototype来定义你的回调:

$('edit_foo').observe('ajax:before', loading_function());
$('edit_foo').observe('ajax:complete', complete_function());

将原始问题中的语法用于Jquery UJS驱动程序。如果您不确定自己拥有哪个UJS驱动程序,请检查public/javascripts是否有rails.js或jquery_ujs.js。这适用于Rails 3.0;我相信Rails 3.1更改为使用jquery作为默认的UJS驱动程序。

无论您使用哪种UJS驱动程序,都应该能够查看文件内部并验证是否存在以下回调:ajax:beforeSendajax:successajax:complete,{{1 }}

实际上有几个原因导致我的AJAX回调没有被解雇:

  • 使用不同的javascript库来定义来自UJS驱动程序的回调
  • 同时使用两个javascript库(可以这样做,但需要调用ajax:error
    • 首先包含jQuery.noConflict()
    • prototypejQuery.noConflict()jquery javascript包含标记之后,但在包含其他js库标记之前,请致电jquery_ujs
    • 在使用这两个库时不要调用application,因为您必须指定js include order

修改:问题的答案在于this link。显然,Rails UJS驱动程序实现的原始6个ajax事件是:javascript_include_tag :defaultsajax:beforeajax:loadingajax:successajax:failureajax:complete

这6个被编辑为:

  • AJAX:beforeSend
  • AJAX:成功
  • AJAX:完整
  • AJAX:错误

你的事件被解雇的原因是因为他们没有改变。另一个没有被解雇,因为它被删除了。您可能正在查看旧文档,可能是Rails 3的早期版本或预发行版。

答案 2 :(得分:0)

Valid Ror Ajax callbacks

ajax:beforeSend // equivalent to ajax:loading in earlier versions
ajax:success
ajax:complete
ajax:error // equivalent to ajax:failure in earlier versions