2017-02-09 3 views
4

Ich versuche, Eltern-ID beim Klicken mit jquery zu erhalten.Ermitteln der Eltern-ID für Kind klicken

Meine django Vorlage ist wie folgt:

<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> 

Und mein js ist wie folgt:

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

Wie kann ich die dataset['calculationId'] der Eltern erhalten unabhängig davon, ob ich auf Kind geklickt.

Mit meinem Code bekomme ich undefined in Alarm. Aber wenn ich zum Beispiel data-calculation-id={{ calculation.id }} zu einem td hinzufügen und wenn ich dann darauf klicke, dann bekomme ich die richtige ID.

Gibt es eine Möglichkeit, die ID von Parent zu erhalten, egal, ob auf Child oder auf Eltern geklickt wird?

Antwort

5

Verwenden e.currentTarget, nicht target:

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

Da Sie Ereignis delegieren, wird e.currentTarget TR-Element sein, und Ziel wird sein, was Sie in dieser TR geklickt haben, vielleicht TD oder etwas in ihm.

Eine weitere einfache Lösung ist einfach this zu verwenden, wie es immer in Ereignishandler TR Punkt:

var calculation_id = this.dataset.calculationId; 
4

Da Sie jQuery verwenden Sie die jQuery-Methode .data() stattdessen verwenden könnte:

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

Hoffe das hilft.

$(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

Das ist gut (ich würde wahrscheinlich verwenden 'this.dataset'), aber es ist immer noch wichtiger Unterschied zwischen' e.target' und 'e.currentTarget' zu verstehen. – dfsq

+0

Richtig, nur ich denke, es ist besser, reine js mit jQuery nicht zu mischen, wenn wir nur mit einem von ihnen den Trick machen konnten. –

0

prüft für Daten-Berechnung-ID auf aktuelles Ziel und wenn es nicht definiert ist seine Mutter überprüfen.

<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

Können Sie den Punkt dieses Teils erklären? || e.currentTarget.parentElement.dataset ['calculationId'] '? Weil 'e.currentTarget' immer' tr [Daten-Archiv-Zeile] 'ist. – dfsq

+0

OP hat gebeten, die Datenberechnungs-ID des übergeordneten Elements zu verwenden, wenn das aktuelle Ziel nicht definiert ist. –

+0

Ich denke, OP versucht, Problemumgehung des Verwendens von 'e.target' zu schaffen, das tatsächlich undefined für TD geben würde, und wir müssten eine Stufe aufwärts gehen. Aber in Ihrer Lösung macht es keinen Sinn, denn currentTarget garantiert TR. – dfsq

Verwandte Themen