IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Fonction qui ne s'execute pas


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 23
    Points : 17
    Points
    17
    Par défaut Fonction qui ne s'execute pas
    Bonjour à tous,

    J'ai un probléme bizarre, en gros j'ai créer une fonction en javascript qui doit me donner le total de la somme de 30 valeurs. Jusque la pas de souci, j'intégre ma fonction pour qu'elle marche et la c'est le drame.

    Voici ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	// PERMET DE CALCULER LE PRIX TOTAL
    	function prixTotal() {
    		var tot = 0 ;
    		// TOTAL DES 30 LIGNES D'ELEMENTS
    		for (k = 0 ; k < 30 ; k++) {
    			if (document.getElementById('id_TOT'+k).value != "") {
    			      tot = Math.round((parseFloat(tot) + parseFloat(document.getElementById('id_TOT'+k).value)) * 100) / 100;
    			}
    		}
    		document.getElementById('id_TOTAL').value = parseFloat(tot);
    	}
    Je m'explique :

    Lorsque j'execute cette fonction dans une autre fonction mon element document.getElementById('id_TOTAL').value ne recupére pas la valeur 'tot' correspondant au total des lignes.

    Par contre le fait d'ajouter un simple alert('test'); en premiere ligne de ma fonction ceci retourne bien la valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	// PERMET DE CALCULER LE PRIX TOTAL
    	function prixTotal() {
                             alert('test');
    		var tot = 0 ;
    		// TOTAL DES 30 LIGNES D'ELEMENTS
    		for (k = 0 ; k < 30 ; k++) {
    			if (document.getElementById('id_TOT'+k).value != "") {
    			      tot = Math.round((parseFloat(tot) + parseFloat(document.getElementById('id_TOT'+k).value)) * 100) / 100;
    			}
    		}
    		document.getElementById('id_TOTAL').value = parseFloat(tot);
    	}
    J'ai aussi placé le alert('test'); dans la fonction qui utilise celle ci juste avant et la pas de probleme ca marche aussi mais des que je vire le alert('test'); ca marche plus...

    ...je sais pas pkoi j'ai pensé au temps d'execution de la boucle qui serait trop important mais bon l'addition de 30 nombres je pense pas que cela prenne tant de temps, et puis je pense que javascript n'execute la pochaine instruction que lorsque la precedente est terminée.

    Donc si kk a une idée.


    Fonction qui utilise la fonction prixTotal() qui marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    	function sendData(data, page, method, ligne, numero) {
    		if ((data.substring(8, data.length) == "") || (((data.length - 8) == 8) && (isNaN(data.substring(8, data.length)) != true))) {
    			// RECUPERER LE NAVIGATEUR UTILISE PAR L'UTILISATEUR ET CREE L'OBJET XMLHTTPREQUEST EN CONSEQUENCE
    			if (document.all) {
    				// OBJET XMLHTTPREQUEST POUR INTERNET EXPLORER
    				var XhrObj = new ActiveXObject("Microsoft.XMLHTTP") ;
    			}
    			else {
    				// OBJET XMLHTTPREQUEST POUR MOZILLA ET AUTRES NAVIGATEURS
    				var XhrObj = new XMLHttpRequest();
    			}
     
    			// TEST LE CHANGEMENT D'ETAT DE L'OBJET
    			XhrObj.onreadystatechange = function() {
    				// readyState == 4 : TOUTES LES DONNEES SONT CHARGEES
    				// status == 200   : CODE REPONSE DU SERVEUR - 200 SIGNIFIE QUE LE SERVEUR EST OK
    				if (XhrObj.readyState == 4 && XhrObj.status == 200) {
    					document.getElementById(ligne).innerHTML = XhrObj.responseText;
    				}
    			}
     
    			// OUVERTURE DU FICHIER PHP QUI CONTIENT LA REQUETE PAR LA METHODE POST
    			XhrObj.open("POST", page);
    			XhrObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    			XhrObj.send(data+numero);			
    		}
    		else {
    			alert('ATTENTION ! LE CODE SAP SAISI \"'+data.substring(8, data.length)+'\" EST INCORRECT.');
    			razValeur(numero);
    		}
     
    		// CALCUL LE PRIX TOTAL
     
    		document.getElementById('id_TOTAL').value = '';
    		prixTotal();
    	}
    Fonction qui utilise la fonction prixTotal() + alert() qui marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    	function sendData(data, page, method, ligne, numero) {
    		if ((data.substring(8, data.length) == "") || (((data.length - 8) == 8) && (isNaN(data.substring(8, data.length)) != true))) {
    			// RECUPERER LE NAVIGATEUR UTILISE PAR L'UTILISATEUR ET CREE L'OBJET XMLHTTPREQUEST EN CONSEQUENCE
    			if (document.all) {
    				// OBJET XMLHTTPREQUEST POUR INTERNET EXPLORER
    				var XhrObj = new ActiveXObject("Microsoft.XMLHTTP") ;
    			}
    			else {
    				// OBJET XMLHTTPREQUEST POUR MOZILLA ET AUTRES NAVIGATEURS
    				var XhrObj = new XMLHttpRequest();
    			}
    			
    			// TEST LE CHANGEMENT D'ETAT DE L'OBJET
    			XhrObj.onreadystatechange = function() {
    				// readyState == 4 : TOUTES LES DONNEES SONT CHARGEES
    				// status == 200   : CODE REPONSE DU SERVEUR - 200 SIGNIFIE QUE LE SERVEUR EST OK
    				if (XhrObj.readyState == 4 && XhrObj.status == 200) {
    					document.getElementById(ligne).innerHTML = XhrObj.responseText;
    				}
    			}
    			
    			// OUVERTURE DU FICHIER PHP QUI CONTIENT LA REQUETE PAR LA METHODE POST
    			XhrObj.open("POST", page);
    			XhrObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    			XhrObj.send(data+numero);			
    		}
    		else {
    			alert('ATTENTION ! LE CODE SAP SAISI \"'+data.substring(8, data.length)+'\" EST INCORRECT.');
    			razValeur(numero);
    		}
    		
    		// CALCUL LE PRIX TOTAL
    		
    		document.getElementById('id_TOTAL').value = '';
    		alert('test');
     		prixTotal();
    	}
    J'avoue je coince un peu la autant pour xmlHTTPRequest pas de souci grace au tuto, idem pour les arrondis malgres queques heures de casse tete mais la je sais vraiment pas de quoi ca vient :s :$

    Merci d'avance pour vos réponses.

    Je vous tiens au courant si je trouve d'ici la.

  2. #2
    Membre actif Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Points : 224
    Points
    224
    Par défaut
    Salut,

    Déjà, il y a quelque chose de bizarre dans ta somme puisque tot n'est pas incrémenté mais écrasé par la valeur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (document.getElementById('id_TOT'+k).value != "") {
          tot += Math.round((parseFloat(tot) + parseFloat(document.getElementById('id_TOT'+k).value)) * 100) / 100;
    }
    Quand tu dis que ça ne te retourne pas la valeur, tu veux dire la somme réelle ou simplement que ça ne te renvoi rien ?
    il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
    Des fois ça malche, des fois ça malche pas. Garcimore

  3. #3
    Membre actif Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Points : 224
    Points
    224
    Par défaut
    Autant pour moi, j'avais pas fait attention au parseFloat(tot) interne.
    Ca veut dire qu'à chaque fois que tu ajoute une valeur, tu l'arrondis ?

    Attention, cela ne te donnera pas la même chose que d'arrondir la somme totale !
    il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
    Des fois ça malche, des fois ça malche pas. Garcimore

  4. #4
    Membre averti Avatar de linar009
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    497
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 497
    Points : 323
    Points
    323
    Par défaut
    ah ouais? parseFloat c'est pour arrondir ?
    Je savais pas...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Pour être un peu plus clair encore enfin je vais essayer :

    ce qui se passe c'est que j'ai un tableau qui contient des code produits, qte, prix unitaire, d'autre informations, et une colonne qui effectue (qte * prix unitaire)

    et donc j'ai un crée un autre tableau (1 ligne + 3 colonnes) dans la dernier colonne j'affecte le resultat de la somme de toutes les valeurs.

    Hors j'ai eu pas mal de probléme liés aux virgules flottante, c'est pourquoi je fais un Math.round() que je multiple par 100 puis que je divise par 100 pour obtenir le bon resultat sinon j'obtiens des choses du type (124.21 +250.12 = 374.399999999999995)

    Par contre je pense que j'ai mal expliqué ce que je veux faire :

    OBJECTIF

    En fait, ce que je fais je cree un tableau, a l'intérieur duquel je crée 30 tableaux qui contiennent 1lignes & 6 colonnes. (une sorte de feuille Excel en gros)

    Les deux premieres colonnes sont liées a des evenements : onChange.

    La premiere colonne qui gere un code articles permet au onChange de recupere des valeurs dans ma base mySQL et de les attribuées aux autres colonnes. (fonction sendData() tirée du tuto sur le site Sujet - xmlHTTPRequest)

    La deuxieme récupere la quantite et au onChange permet de faire la multiplication de la QTE * PRIX UNITAIRE (le prix unitaire est récupéré par ma requete lorsque l'on saisi un code produit)

    et donc automatiquement lorsque l'on change une QTE ou un CODE ARTILCES on refait la multiplication QTE * PRIX UNITAIRE (car QTE & PRIX INITAIRES ont changés).

    Et donc pour finir, je recalcule le total grace a ma fonction prixTotal().

    Conclusion :

    Mon total se rafraichit bien

    Cela marche trés bien kand j'ajoute des CODE ARTICLES / QTE
    Si je modifie la quantité cela marche tres bien ausi

    Mon total ne se rafraichit pas

    si je change mon CODE ARTICLES


    Ce qui se passe : il recrée le tableau (ce qui correspondrait a la ligne 1 d'un feuille Excel) grace a la fonction sendDatA() puis il doit passer par la fonction prixTotal() pour recalculer le total et la il ne le fait pas. Et comme j'expliquais tout en haut si je met un alert('test'); avant la fonction prixTotal() la ca marche.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    linar009 ah ouais? parseFloat c'est pour arrondir ?
    Je savais pas...
    Non, en fait j'ai fait un parseFloat pour convertir tot en float (nombre décimal) car sinon je recupére un string (chaine de caractére) du coup si je fais une addition celle-ci devient une concaténation. D'ou l'emploi des parseFloat.

    Au cas ou quelqu'un aurait une meilleure méthode je suis preneur car je débute en javascript et on fait comme on peut. :s

  7. #7
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 239
    Points
    3 239
    Par défaut
    Si tu veux mon avis, il y a une faute de synthaxe dans ton script... qui dit la console de FireFox ??
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  8. #8
    Membre actif Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Points : 224
    Points
    224
    Par défaut
    Citation Envoyé par linar009
    ah ouais? parseFloat c'est pour arrondir ?
    Je savais pas...
    ParseFloat non, mais Math.round, oui
    il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
    Des fois ça malche, des fois ça malche pas. Garcimore

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Si ça plante sous IE, vérifie que tu n'utilises pas un nom de variable (ou de fonction ?) qui entre en colision avec l'identifiant d'un objet html de ta page.
    Most Valued Pas mvp

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Si tu veux mon avis, il y a une faute de synthaxe dans ton script... qui dit la console de FireFox ??
    J'ai pas regarder avec FireFox, car les utilisateurs sont tous sous IE (c'est pas ma faute à moi lol) mais par contre de mon cote je peux toujours l'installer pour voir ce qu'il me dit.

    Si ça plante sous IE, vérifie que tu n'utilises pas un nom de variable (ou de fonction ?) qui entre en colision avec l'identifiant d'un objet html de ta page.
    Je vais voir si ca vient de cela car c'est vrai que j'ai beaucoup de nom d'identifiant.

    Je vous tiens au courant si ca vient de cela

  11. #11
    Membre averti Avatar de linar009
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    497
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 497
    Points : 323
    Points
    323
    Par défaut
    Citation Envoyé par Ricou13
    ParseFloat non, mais Math.round, oui

    Merci pour la précision lol

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Donc j'ai testé dans firefox et la console ne m'indique aucune erreur

    Quant aux identifiants html ils commencent tous par 'id_' + libele ex : id_CODE
    contrairement aux fonctions. En recherchant tous les noms de fonctions sur mes pages html je ne trouve pas de nom de fonction qui soit identique aux identifiants html

  13. #13
    Membre actif Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Points : 224
    Points
    224
    Par défaut
    Salut,

    T'as une page en ligne qu'on puisse voir le code dans son contexte ?
    il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
    Des fois ça malche, des fois ça malche pas. Garcimore

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Coucou Ricou13,

    désolé pour le moment j'ai rien en ligne car je suis au boulot mais je mets cela a dispo ce soir en rentrant comme ca vous pourrez mieux voir mon probléme.

    Et mille merci de suivre mon probleme et de tenter de touver des solutions c'est vraiment gentil

Discussions similaires

  1. une fonction qui ne s'execute pas correctement
    Par chmek firas dans le forum Débuter
    Réponses: 4
    Dernier message: 14/05/2012, 22h26
  2. Fonction qui ne s'execute pas
    Par cassis2k dans le forum Langage
    Réponses: 5
    Dernier message: 29/06/2010, 07h18
  3. Jquery fonction qui ne s'execute pas sous IE6 IE7
    Par boutmos dans le forum jQuery
    Réponses: 2
    Dernier message: 06/10/2009, 14h54
  4. Jquery fonction qui ne s'execute pas sous IE6 IE7
    Par boutmos dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 06/10/2009, 11h44
  5. fonction qui ne s'execute pas mais qui ne retourne pas d'erreur
    Par duplo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/06/2006, 21h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo