2010-03-08 7 views
1

Jetez un oeil à ce tableau:Trouver classe dans la table rangée

<table cellpadding="0" cellspacing="0" class="order_form"> 
    <tr> 
     <th>Amount</th> 
     <th>Desc</th> 
     <th>Price</th> 
     <th>Total</th> 
    </tr> 
    <tr> 
     <td><input type="text" class="order_count" /></td> 
     <td> 
      <span class="order_desc">Middagstallerken</span> 
     </td> 
     <td> 
      <span class="order_price">1,15</span> 
     </td> 
     <td> 
      <span class="order_each_total"></span> 
     </td> 
    </tr> 
    [...] 
</table> 

En entrant montant que je dois sélectionner la classe « order_price » et multiplier par la valeur de l'entrée « ORDER_COUNT » et le placer dans "order_each_count". J'ai beaucoup de ces lignes donc j'ai besoin de trouver le prochain cours dans la rangée.

J'ai essayé d'utiliser une fonction comme cela, mais sans résultat:

<script type="text/javascript"> 
    $(document).ready(function(){ 
     $('.order_count').keyup(function() { 
      var each_price = $(this).prevUntil("tr").find("span.order_price").text(); 
     }); 
    }); 
</script> 

J'espère que quelqu'un a une bonne solution :-)

+0

Est-ce que votre fonction 'keyup' est appelée? –

+0

Etes-vous sûr de vouloir faire cela sur le client? Pourriez-vous faire ces calculs sur le serveur pendant que vous générez la table? Avez-vous * vraiment * des millions de lignes? – Douglas

+0

Non pas des millions, plus comme 40 :-) Désolé pour l'utilisation de millions, hehe. – janhartmann

Répondre

2

Utilisation closest() au lieu de prevUntil:

$(document).ready(function(){ 
    $('.order_count').keyup(function() { 
     var amount = parseInt($(this).val(), 10); 
     var each_price = $(this) 
          .closest('tr') 
          .find('span.order_price') 
          .text() 
          .replace(',', '.'); // Floats use . as separator 

     each_price = parseFloat(each_price); 
     total_price = amount * each_price; 

     // Update the value 
     $(this) 
      .closest('tr') 
      .find('span.order_each_total') 
      .text(total_price 
       .toFixed(2) // "Round" to two decimal places 
       .replace('.', ',') // Format properly 
      ); 
    }); 
}); 

N'oubliez pas d'utiliser parseFloat ou parseInt lorsque vous essayez d'utiliser des numéros de DOM dans les calculs – ils sont des chaînes par défaut.

+0

Très bien :-) Fonctionne comme un charme, sauf la fonction de remplacement. Ce n'est pas reconnu. – janhartmann

+0

Vous devriez passer une base à parseInt à moins que vous ne vouliez en deviner un. Par exemple, parseInt ($ (this) .val(), 10). https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/ParseInt – Douglas

+0

Fixé remplacer en commutant .toFixed et .replace :-) – janhartmann