3

Ruby on Rails 3.0.7 アプリで jQuery 1.6.2 を使用しており、 (jQuery 1.7 にアップグレードして を使用する予定で)から.live()に切り替えたいと考えています。Railsのオプションを使用してajax リクエストを送信し、イベントを使用してレスポンスのハンドラーを設定しようとしています。これらの ajax リクエストは、多くの場合、実際にリクエストをトリガーした要素を削除/置換します。.delegate().on():remote => trueajax:complete

私が抱えている問題は、要素がajaxリクエストに置き換えられた場合、リクエストが完了したときにとにかくハンドラー.live()をトリガーするように見えるが、そうではないことです(また、jQuery 1.7で少し実験を行い、それが機能しないことがわかりましたまた)。ajax:complete.delegate().on()

基本的に、ajax_link要素が置き換えられた場合、これは機能します:

$(".ajax_link").live("ajax:complete", function(){
  //Do something...
});

しかし、これはしません:

$("body").delegate(".ajax_link", "ajax:complete", function(){
  //Do something...
});

なぜこれが起こっているのかについて何か考えはありますか? 舞台裏で.delegate()使用するSOの他の場所を読んだので、この動作は私にとって驚くべきものです。.live()また、この問題に取り組むためのより良い方法についての提案は大歓迎です。

4

1 に答える 1

3

jquery 1.7 および 1.8 では、削除された要素からイベントをトリガーしても、ドキュメントにバブルアップしません。bodyそのため、またはに登録されているコールバック ハンドラdocumentは呼び出されません。

これを回避するには、次のことを行う必要があります。

  1. completeセレクターなしでコールバックを登録します。

    $(document).on('ajax:complete', function() {
      // do something
    });
    
  2. handleRemote関数をパッチして、要素がドキュメントから切り離されrails.jsた場合にイベントをトリガーします。document

    交換:

      complete: function(xhr, status) {
        element.trigger('ajax:complete', [xhr, status]);
    

    と:

      complete: function(xhr, status) {
        if (element.parents().last().parent().get(0) == document)
          element.trigger('ajax:complete', [xhr, status]);
        else
          $(document).trigger('ajax:complete', [xhr, status]);
    

それについては、rails-ujs の issue #223 にコメントを入れました。

于 2012-09-11T08:11:07.993 に答える