Version complète: sur le forum Webmaster Hub : Problème de non réexécution de script Javascript
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > Scripts et utilitaires
Vanator
Bonjour,

hier j'ai posté un message pour un script. Après que le problème soit résolu, j'ai à nouveau un autre problème (toujours sur le même script).

Pour info voir ici : sujet du problème précédent

Maintenant j'ai un autre soucis. J'ai fait un petit script tout simple qui recalcule le prix total pour chaque article selon son prix unitaire et la quantité souhaitée.

Voici le code :
CODE
function prix(i)
{
    quantite = eval('document.formulaire.quantite_'+i);
    prix = eval('document.formulaire.prix_'+i);
    tot = eval('document.formulaire.total_'+i);
    tot.value = quantite.value * prix.value;
}

où la variable "i" est l'identifiant de l'objet.

Ce que je ne comprends pas c'est que le script fonctionne correctement 1 fois, mais après lorsque je rempli une 2e champ et qu'il doit recalculer pour le 2e total en réexecutant le même script, il ne fonctionne pas sad.gif

Quelqu'un peut-il m'aider ? Merci d'avance smile.gif
Vincent
sur quel evenement tu demandes l'execution de la fonction?
Vanator
dans ma page PHP j'ai ceci comme code :
CODE
echo '<td class="prix"><input type="text" name="quantite_'.$i.'" class="champ" maxlength="2" value="0" onchange="prix('.$i.')"/></td>';

où $i est donné en fonction d'une boucle.

J'ai le même soucis si je mets onblur.
Vanator
Voici même le formulaire de la page PHP en entier (au cas où cela vienne d'autre chose) :
CODE
echo '<form method="post" name="formulaire" action="cor_commande_pdf.php">';
   echo '<table id="commande">';
    echo '<tr>';
     echo '<td><h4>Désignation du produit</h4></td>';
     echo '<td><h4>Quantité</h4></td>';
     echo '<td><h4>Prix unitaire</h4></td>';
     echo '<td><h4>Total</h4></td>';
    echo '</tr>';
    $requete = mysql_query('SELECT * FROM cor ORDER BY cor_id DESC');
    $nombre = mysql_num_rows($requete);
    $i = 1;
    while($data = mysql_fetch_object($requete))
    {
     echo '<tr>';
      echo '<td><span class="gras">n°'.afficher($data->cor_id).'</span> - '.afficher($data->cor_titre).'</td>';
      echo '<td class="prix"><input type="text" name="quantite_'.$i.'" class="champ" maxlength="2" value="0" onchange="prix('.$i.')"/></td>';
      echo '<td class="prix"><input type="text" name="prix_'.$i.'" class="prix" value="5.50" onfocus="this.blur();"/></td>';
      echo '<td class="prix"><input type="text" name="total_'.$i.'" class="champ" value="0" onfocus="this.blur();"/></td>';
     echo '</tr>';
     $i = $i + 1;
    }
    echo '<tr>';
     echo '<td><h4>Frais de port</h4></td>';
     echo '<td></td>';
     echo '<td class="prix"><input type="text" name="frais_port" class="prix" value="1.50" onfocus="this.blur();"/></td>';
     echo '<td class="prix"><input type="text" name="total_port" class="champ" onfocus="this.blur();"/></td>';
    echo '</tr>';
    echo '<tr id="total">';
     echo '<td><b>TOTAL NET A PAYER</b></td>';
     echo '<td></td>';
     echo '<td></td>';
     echo '<td class="prix"><input type="text" name="total_final" class="champ" onfocus="this.blur();"/></td>';
    echo '</tr>';
   echo '</table>';
    echo '<p class="centre"><input type="submit" value="Valider" /></p>';
  echo '</form>';
Vanator
Y'a un truc qui est bizarre c'est que si je teste les lignes une par une en rajoutant au fûr et à mesure pour voir quand ça bloque, si je mets ceci :
CODE
function prix(i)
{
    alert('test');
    quantite = eval('document.formulaire.quantite_'+i);
}
ça fonctionne.

Mais dès que je mets celà :
CODE
function prix(i)
{
    alert('test');
    quantite = eval('document.formulaire.quantite_'+i);
    prix = eval('document.formulaire.prix_'+i);
}
ça bloque, mais je ne vois pas pourquoi sad.gif
Vincent
utilise la fonction parseFloat pour t'assurer que ta valeur récupérée soit bien numerique.
CODE
function prix(i)
{
alert('test');
quantite = eval('parseFloat(document.formulaire.quantite_'+i));
prix = eval('parseFloat(document.formulaire.prix_'+i));
}
Vanator
Ne faut-il pas mettre plutôt
CODE
function prix(i)
{
    alert('test');
    quantite = eval('parseFloat(document.formulaire.quantite_'+i+')');
    prix = eval('parseFloat(document.formulaire.prix_'+i+')');
}
Pour les parenthèses ?

Enfin sans cette correction ça ne calcule plus rien et ça met une erreur avant, et avec ça ne marche pas plus sad.gif
Vincent
oui voila le travail quand on réponds a la volé wink.gif
il faut d'abord evaluer la chaine de caractere puis s'assurer que LA VALEUR est en numérique (et non l'objet comme j'ai marqué).

2e essai
CODE
function prix(i)
{
var quantite = eval('document.formulaire.quantite_'+i);
var prix = eval('document.formulaire.prix_'+i);
var tot = eval('document.formulaire.total_'+i);
tot.value = parseFloat(quantite.value) * parseFloat(prix.value);
}


mais je ne vois pas vraiment pourquoi tu dis que tu as une erreur sur la construction de ta variable prix.
Vanator
Bah je n'ai pas d'erreur, le soucis que j'ai c'est que je ne sais pas pourquoi la 1ère fois le script s'exécute parfaitement sans soucis, mais dès qu'on change la valeur d'un 2e champ là ça créé une erreur, quel que soit le champ rempli en 1er et en 2e.

Je ne comprends vraiment pas sad.gif

C'est comme si quelque chose changé à la première exécution et non réinitialisé empêchait le script de s'exécuter une seconde fois... sad.gif

Hier j'ai apssé toute la journée sur ce #&@% formulaire en vérifiant 6549465 possibilités et au final je ne sais toujours pas ce qui se passe, j'en deviens wacko.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.