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

use*_*065 4 ajax jquery ruby-on-rails

这是我的代码:

$('#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!");});
Run Code Online (Sandbox Code Playgroud)

ajax:successajax:complete火,我看到两个警报.ajax:loading才不是.

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

Aru*_*run 9

请使用以下链接更正您的ajax事件方法名称

http://docs.jquery.com/Ajax_Events

  • 是的但是rails有自己的方法名和ajax:loading是一个有效的方法名称不是吗? (4认同)
  • 不是它不是一个有效的方法.尝试'ajax:beforeSend'而不是'ajax:loading'.所以,这个'beforeSend'和'loading'做的工作相同.说到jquery,你必须使用'beforeSend'而不是'loading'. (3认同)
  • 哇,谢谢!有大量的文档在线引用`ajax:loading`而不是`ajax:beforeSend`. (3认同)

Eri*_* Hu 5

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

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

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

$('edit_foo').observe('ajax:before', loading_function());
$('edit_foo').observe('ajax:complete', complete_function());
Run Code Online (Sandbox Code Playgroud)

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

无论哪种UJS你有驱动程序,你应该能够看里面的文件,并确认有以下回调:ajax:beforeSend,ajax:success,ajax:complete,ajax:error.

实际上有几个原因导致我的AJAX回调没有触发:

  • 使用不同的JavaScript库来定义UJS驱动程序的回调
  • 同时使用两个javascript库(这可以完成,但需要调用jQuery.noConflict())
    • 包括prototype第一.
    • 通话jQuery.noConflict()jquery,jquery_ujsapplicationJavaScript的包括标签,但在此之前包括其它JS库标签
    • javascript_include_tag :defaults使用两个库时不要调用,因为您必须指定js include order

编辑:您的问题的答案在于此链接.很显然的是,Rails的UJS驱动程序实现原来的6 AJAX事件是:ajax:before,ajax:loading,ajax:success,ajax:failure,ajax:complete,ajax:after.

这6个被编辑为:

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

您的事件被解雇的原因是因为它们没有变化.另一个没有开火,因为它已被移除.您可能正在查看旧文档,可能是Rails 3的早期版本或预发行版.