2017-02-09 8 views
4

jqueryでクリックすると親IDを取得しようとしています。子のクリックで親のIDを取得する

次のように私のDjangoテンプレートは次のように

<table id="archive-table" class="table table-hover table-vcenter"> 
    <thead> 
     <tr> 
      <th>Make and model</th> 
      <th>First registration</th> 
     </tr> 
    </thead> 
    <tbody> 
     {% for calculation in calculations %} 
      <tr data-archive-row class="archive-row" data-calculation-id={{ calculation.id }}> 
       <td>{{ calculation.first_registration }}</td> 
       <td>{{ calculation.body }}</td> 
      </tr> 
     {% endfor %} 
    </tbody> 
</table> 

そして、私のjsがある:

<script> 
    $(document).ready(function() { 
     $('#archive-table').on('click', '[data-archive-row]', function (e) { 
      var calculation_id = e.target.dataset['calculationId']; 
      alert(calculation_id) 
     }) 
    }); 
</script> 

私は関係なく、私は子供をクリックした場合、親のdataset['calculationId']を取得することはできませんどのように。

私のコードでは、が未定義になっています。しかし、たとえば私がdata-calculation-id={{ calculation.id }}を1つに追加するのであれば、tdとし、それをクリックすれば正しいidが得られます。

子供が親をクリックしても、親を親から取得する方法はありますか?

答えて

5

使用e.currentTarget、ないtarget

$(document).ready(function() { 
    $('#archive-table').on('click', '[data-archive-row]', function(e) { 
    var calculation_id = e.currentTarget.dataset.calculationId; 
    alert(calculation_id) 
    }) 
}); 

あなたがイベントを委任されているので、e.currentTargetはTR要素になり、ターゲットはあなたがこのTR、多分TDまたはそれに何かの中にクリックしたものは何でもなります。

var calculation_id = this.dataset.calculationId; 
4

あなたはjQueryのを使用しているので、あなたが使用することができ.data()代わりにjQueryのメソッド::

別の簡単な解決策は、イベントハンドラで常にTRを指すようになりますよう単にthisを使用することです

$('#archive-table').on('click', '[data-archive-row]', function (e) { 
    var calculation_id = $(this).data('calculation-id'); 
    alert(calculation_id) 
}) 

これが役に立ちます。現在のターゲットにして、その親をチェックし、未定義であるかのデータ計算-idの

$(document).ready(function() { 
 
    $('#archive-table').on('click', '[data-archive-row]', function (e) { 
 
    var calculation_id = $(this).data('calculation-id'); 
 

 
    console.log(calculation_id); 
 
    }) 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<table id="archive-table" class="table table-hover table-vcenter"> 
 
    <thead> 
 
    <tr> 
 
     <th>Make and model</th> 
 
     <th>First registration</th> 
 
    </tr> 
 
    </thead> 
 
    <tbody> 
 
    <tr data-archive-row class="archive-row" data-calculation-id='calculation.id'> 
 
     <td>calculation.first_registration</td> 
 
     <td>calculation.body</td> 
 
    </tr> 
 
    </tbody> 
 
</table>

+0

これは良いです(私はたぶん 'this.dataset'を使用します)が、' e.target'と 'e.currentTarget'の違いを理解することが重要です。 – dfsq

+0

そうですね、純粋なjsとjQueryを混ぜないほうが良いと思います。 –

0

チェック。

<script> 
    $(document).ready(function() { 
     $('#archive-table').on('click', '[data-archive-row]', function (e) { 
      var calculation_id = e.currentTarget.dataset['calculationId'] 
           || e.currentTarget.parentElement.dataset['calculationId']; 
      alert(calculation_id) 
     }) 
    }); 
</script> 
+0

この部分のポイントを説明できますか? e.currentTarget.parentElement.dataset ['計算ID'] '? 'e.currentTarget'は常に' tr [data-archive-row] 'になるからです。 – dfsq

+0

OPは、現在のターゲットに定義されていない場合、親のデータ計算IDを使用するように求めました。 –

+0

私はOPが 'e.target'を使って問題を回避しようとしていたと思います。これは実際にはTDに対して未定義となりますので、レベルを上げる必要があります。しかし、あなたの解決策では、currentTargetがTRであることを保証するので意味をなさない。 – dfsq

関連する問題