2017-03-02 16 views
1

これは動作します:これはしません イベントハンドラが外部JSファイルで動作していませんか?

<html><head></head> 
    <body> 
    //content-wrapper --> ajax loaded 
    <script type="text/javascript"> 
     $(document).ajaxComplete(function(event, xhr, settings) { 
      var a_row_id = 0; 
      $('body').on('click', '.ready-create-rename-row', function() { 
       a_row_id = $(this).data('row-id'); 
       console.log('Attempting to rename row ' + a_row_id); 
      }); 
     }); 
    </script>  
    </body> 
</html> 
を(一つのファイルにすべてのそれを維持する):私はすべてのエラーを得ていないんだけど、イベントハンドラは発生しません。コンソールが空

<html><head></head> 
    <body> 
    <!-- content-wrapper -- ajax loaded -->   
    <script src="<?php echo base_url();?>assets/js/func_rows.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
     //Some code in document.ready 
    </script>  
    </body> 
</html> 

func_rows.jsまま:

$(document).ajaxComplete(function(event, xhr, settings) { 
    var a_row_id = 0; 
    $('body').on('click', '.ready-create-rename-row', function() { 
     a_row_id = $(this).data('row-id'); 
     console.log('Attempting to rename row ' + a_row_id); 
    }); 
    //Other events here get fired however 
}); 

をアヤックスは、コンテンツをロード:私を混乱何

<div class="row-options"> 
    <button type="button" class="flat circle ready-create-rename-row" 
       data-row-id=<?php echo $r->id; ?> 
       data-label-id='row_rename_<?php echo $r->id; ?>' 
       data-toggle="modal" 
       data-target="#rename-row-modal"> 
       <i class="mdi mdi-pencil"></i> 
    </button> 
</div> 

<!-- Rename Row Confirmation Modal --> 
<div id="rename-row-modal" class="modal fade" role="dialog"> 
    <div class="modal-dialog plain-material-dialog confirmation"> 
     <!-- Modal content--> 
     <div class="modal-content plain-material-content"> 
     <div class="modal-body plain-material-body"> 
       Rename Row 
     <div class="material-input-group stretched"> 
        <label>Row name</label> 
        <input type="text" id="create-new-row-name" required> 
       </div> 
     </div> 
     <div class="modal-footer plain-material-footer"> 
      <button type="button" class="btn btn-default flat" data-dismiss="modal">cancel</button> 
      <button type="button" class="btn btn-default flat" id="create-rename-row">rename</button> 
     </div> 
     </div> 
    </div> 
</div> 

はしても、彼らfunc_rows.jsajaxComplete内の他のイベントハンドラが起動してしまうことがありますajaxをロードした要素にバインドされています。私が期待しているのは、.ready-create-rename-rowでボタンをクリックすると、メッセージがコンソールにポップアップしても何も起こらないということです。しかし、イベントハンドラを(テンプレートとしての役目を果たす)同じhtmlファイルに置くと動作します。

+0

委任されたイベントハンドラをアタッチしているときに '$ .ajaxComplete()'を使用するのはどうしてですか?これでやることは、連続したリクエストでハンドラを複製することです。 –

+0

私はAJAXがロードされたコンテンツに必要と思っていました。だから、それを削除するのは大丈夫ですか? – herondale

+0

絶対に問題ありません。デリゲートされたイベントハンドラを単独で使用してください。 –

答えて

0

犯人はajaxCompleteハンドラ内の別の方法で判明:

$('body').off().on('click', '.rename-row' function() 
{ 
    //stuff 

    $.ajax({ 
    //Stuff 
    }); 
}); 

.off()は、基本的には、その前に来たすべてのイベントを無効にされたので、私は一番上にそれを置くために持っていただけ'body'を変更より安全になるためには、クラス.rename-row'に。

関連する問題