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

jQuery Discussion :

calcul dynamique d'un tableau input


Sujet :

jQuery

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut calcul dynamique d'un tableau input
    bonjour j'ai réaliser un script qui permet de cloner des ligne de tableau et cela marche bien mais je bloque pour parcours les input et calculer la somme des valeurs

    voici mon code pour mieux me comprendre

    Code html : 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
    <form method="post" action="acceuil.php">
    	<!-- test table 2 -->
    	<label>Numero Facture</label>
    	<input type="text" required="required"   name="num_fac"  class="auto" /><span class="info"></span> 
    	<table  id="table2" border="1">
    		<tr>
    			<th></th>
    			<th>Montant</th>
    			<th>Date Echeance</th>
    			<td><img src="images/add.png" class="cloneTableRows" /></td>
    		</tr>
    		<tr>
    			<td><img src="images/del.png" alt="" class="delRow" style="visibility: hidden;" /></td>
    			<td><input type="text"   id="montant" required="required"   name="mont[]" />   </td>
    			<td><input type="text"  required="required"  name="date_echeance[]" class="my_date" /></td>
    			<span class="montantvalide"></span>
    			<td></td>
    	 	</tr>
    		<tr>
    			<td><img src="images/del.png" alt="" class="delRow" style="visibility: hidden;" /></td>
    			<td><input type="text"  required="required"   name="mont[]" /></td>
    			<td><input type="text"  required="required"  name="date_echeance[]" class="my_date" /></td>
    			<td></td>
    		</tr>
    	</table>
    	<input  id="buttonform" type="submit" name="button_echeance" value="valider" />
     </form>

    code pour le clonage

    Code javascript : 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    $(document).ready(function(){
    	//	-- Datepicker
    	$(".my_date").datepicker({
    		dateFormat: 'yy-mm-dd',
    		showButtonPanel: true
    	});	
            //autocomplete
            $('body').delegate('.auto', 'focusin', function() {
                    $('.auto').autocomplete({source: "autocomplete.php"});
            });
    	// -- Clone table rows
    	$(".cloneTableRows").live('click', function(){
    		// this tables id
    		var thisTableId = $(this).parents("table").attr("id");
    		// lastRow
    		var lastRow = $('#'+thisTableId + " tr:last");
    		// clone last row
    		var newRow = lastRow.clone(true);
    		// append row to this table
    		$('#'+thisTableId).append(newRow);
    		// make the delete image visible
    		$('#'+thisTableId + " tr:last td:first img").css("visibility", "visible");
    		// clear the inputs (Optional)
    		$('#'+thisTableId + " tr:last td :input").val('');
    		// new rows datepicker need to be re-initialized
    		$(newRow).find("input").each(function(){
    			if($(this).hasClass("hasDatepicker")){ // if the current input has the hasDatpicker class
    				var this_id = $(this).attr("id"); // current inputs id
    				var new_id = this_id +1; // a new id
    				$(this).attr("id", new_id); // change to new id
    				$(this).removeClass('hasDatepicker'); // remove hasDatepicker class
    				 // re-init datepicker
    				$(this).datepicker({
    					dateFormat: 'yy-mm-dd',
    					showButtonPanel: true
    				});
    			}
    		});					
    		return false;
    	});
    	// Delete a table row
    	$("img.delRow").click(function(){
    		$(this).parents("tr").remove();
    		return false;
    	});
    });

    jusqu’à ici j'ai pas de problème
    mais je bloque pour parcours cette ligne
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <td><input type="text"   id="montant" required="required"   name="mont[]" />   </td>
    et calculer la somme des montant

    merci d'avance pour votre aide

  2. #2
    Membre chevronné
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Billets dans le blog
    1
    Par défaut
    Je t'avais poster une réponse mais elle a disparu...

    Bref si tu cherche à boucler sur plusieurs input ayant le même ID ça ne va pas marcher. Modifie donc ton id en class ou ajoute une class à chacun de tes inputs

  3. #3
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    Le problème est loin d'être trivial. La complication vient du clonage d'input ayant l'attribut required et du clonage d'input utilisé par l'UI Datepicker qui ajoute un ID et une classe "hasDatepicker".

    Les explications à donner sur le "comment et le pourquoi" de mon code dépendent beaucoup de votre niveau en jQuery. Je vous conseille de tester ma page en la copiant collant sans rien y changer. Ensuite d'y aller très progressivement.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    <!DOCTYPE html>
    <html lang="fr" dir="ltr">
    <head>
    	<meta charset="utf-8">
    	<meta name="viewport" content="initial-scale=1.0">
    	<meta name="author" content="Daniel Hagnoul">
    	<title>Forum jQuery</title>
    	<script src="http://cdnjs.cloudflare.com/ajax/libs/headjs/0.99/head.min.js"></script>
    	<script>
    		"use strict";
     
    		head.js( 
    			"http://d3js.org/d3.v3.min.js",
    			"http://code.jquery.com/jquery-2.0.3.min.js",
    			"http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/i18n/jquery-ui-i18n.min.js",
    			"http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js",
    			"http://danielhagnoul.developpez.com/lib/dvjh/d3Base.js",
    			function(){
     
    				$( function(){
     
    					$.datepicker.setDefaults( $.datepicker.regional[ "fr" ] );
     
    					var jObjForm = $( "#formID" ),
    						ObjDateOptions = {
    							"dateFormat": "yy-mm-dd",
    							"showButtonPanel" : true
    						};
     
    					$( "input[name^='date_echeance']" ).datepicker( ObjDateOptions );
     
    					jObjForm.on( "click", ".btnCloneTr", function( event ){
     
    						$( "input[name^='date_echeance']" ).datepicker( "destroy" );
     
    						var jObj = $( this ),
    							jObjTr = jObj.parents( "tr" ),
    							jObjClone = jObjTr.clone( false );
     
    						jObjClone
    							.find( "input[name^='date_echeance']" )
    							.removeClass( "hasDatepicker" )
    							.attr( "id", "" )
    							.end()
    							.find( "input" )
    							.val( "" );
     
    						jObj
    							.parents( "tbody" )
    							.append( jObjClone );
     
    						$( "input[name^='date_echeance']" ).datepicker( ObjDateOptions );
     
    						return false;
    					});
     
    					jObjForm.on( "click", ".btnRemoveTr", function(){
     
    						$( "input[name^='date_echeance']" ).datepicker( "destroy" );
     
    						$( this ).parents( "tr" ).remove();
     
    						$( "input[name^='date_echeance']" ).datepicker( ObjDateOptions );
     
    						return false;
    					});
     
    					jObjForm.on( "submit", function( event ){
    						var jObj = $( this ),
    							datas = jObj.serialize(), // contenu des éléments du form ayant un attribut name
    							total = 0;
     
    						// calcul du montant total
    						$( "input[name^='mont']", jObj ).each( function( i, item ){
    							total += parseFloat( $( item ).val() );
    						});
     
    						datas += "&total=" + total;
     
    						// debug console touche F12
    						console.log( datas );
     
    						// code de la transaction AJAX
     
    						return false;
    					});
     
    				});
     
    				$( window ).load( function(){
     
    				});
    			}
    		);
    	</script>
    	<link href='http://fonts.googleapis.com/css?family=Sofia|Ubuntu:400|Kreon'>
    	<link rel="stylesheet" href="http://danielhagnoul.developpez.com/styles/dvjhRemBase.css">
    	<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/themes/sunny/jquery-ui.min.css">
    	<style>
    		/* TEST -- Nota bene : ici 1 rem est égal à 1 px, voir dvjhRemBase.css */
     
    		table.maTable {
    		    margin: 2.5rem;
    		    padding: 2.5rem;
    		    background: #EEEEEE;
    		}
     
    		table.maTable tr {
    		    margin: 2.5rem;
    		    background: rgba(255,128,0,0);
    		}
     
    		table.maTable td {
    		    width: 8rem;
    		    height: 8rem;    
    		    text-align: center;
    		    vertical-align: center;
    		}
     
    		table.maTable td button	{ width: 7em; }
     
    	</style>
    </head>
    <body>
    	<header>
    		<hgroup>
    			<h1>Forum jQuery</h1>
    			<h2>
    				<a href="">Lien</a>
    			</h2>
    		</hgroup>
    	</header>
    	<section class="conteneur">
     
    <form id="formID">
     
    	<label>Numero Facture</label>
    	<input type="text" name="num_fac" required>
     
    	<table class="maTable">
    		<thead>
    			<tr>
    				<th>Montant</th>
    				<th>Date Echeance</th>
    				<th>Actions</th>
    			</tr>
    		</thead>
    		<tbody>
    			<tr>
    				<td>
    					<input type="text" name="mont[]" required>
    				</td>
    				<td>
    					<input type="text" name="date_echeance[]" required>
    				</td>
    				<td>
    					<button class="btnCloneTr">Cloner</button>
    					<button class="btnRemoveTr">Supprimer</button>
    				</td>
    		 	</tr>
    			<tr>
    				<td>
    					<input type="text" name="mont[]" required>
    				</td>
    				<td>
    					<input type="text" name="date_echeance[]" required>
    				</td>
    				<td>
    					<button class="btnCloneTr">Cloner</button>
    					<button class="btnRemoveTr">Supprimer</button>
    				</td>
    			</tr>			
    		</tbody>
    	</table>
     
    	<input type="submit" value="Envoyer">
    </form>
     
    	</section>
    	<footer itemscope itemtype="http://danielhagnoul.developpez.com/">
    		<time datetime="2013-07-31T20:20:45.811+02:00" pubdate>2013-07-31T20:20:45.811+02:00</time>
    		<span itemprop="name">Daniel Hagnoul</span>
    		<a href="http://www.developpez.net/forums/u285162/danielhagnoul/" itemprop="url">@danielhagnoul</a>
    		<a href="http://danielhagnoul.developpez.com/" itemprop="url">Mon cahier d’exercices</a>
    		<a href="http://javascript.developpez.com/faq/jquery/" itemprop="url">FAQ</a>
    		<a href="http://javascript.developpez.com/cours/?page=frameworks#jquery" itemprop="url">Tutoriels</a>
    	</footer>
    </body>
    </html>

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  4. #4
    Membre chevronné
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Billets dans le blog
    1
    Par défaut
    merci pour la démo tu m'as appris la méthode clone() jquery.

    le reste semble claire pour ma part.

    Je n’oserais expliquer le code qu'a l'unique condition qu'il me le soit demander.

    ah si autant pour moi une question concernant cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $( "input[name^='mont']", jObj ).each( function( i, item ){ total += parseFloat( $( item ).val() ); });
    Pourquoi sélectionner aussi jObj? J'ai bien relut ton code mais ça m'échappe...

  5. #5
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Le sélecteur $( "input[name^='mont']", jObj ) sélectionne tous les input[name^='mont'] contenus dans ce que représente l'objet jQuery jObj.

    C'est équivalent à un jObj.find( "input[name^='mont']" ).

    Dans les anciennes versions de jQuery écrire un sélecteur complexe n'était pas recommander, car beaucoup plus lent qu'un find() mais depuis jQuery 1.8 ou 1.9 les sélecteurs complexes sont devenus très performant.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  6. #6
    Membre chevronné
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Billets dans le blog
    1
    Par défaut
    $( "input[name^='mont']", jObj ) Ok encore appris un truc, je pensais que cette notation signifié : sélection des input ayant pour nom "mont" et de l'élément que représente jObj. La virgule signifiant pour moi l'ajout d'un objet à la sélection et non pas une condition (j'espère être clair)

    par exemple:

    $( 'input[type="text"], select ).on( 'change', function() { /*Sthg to do*/ } ); permet à mon sens d'appliquer l’événement change aux select et input type="text" de mon DOM.

  7. #7
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Attention, ton exemple est ambigu car il manque l'apostrophe fermante du sélecteur. Ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $( 'input[type="text"]', select )
    correspond aux explications données par Daniel (en supposant bien sûr que select représente un objet jQuery, alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $( 'input[type="text"], select' )
    correspond à ce que tu décris : tous les input de type texte et toutes les balises <select>.

    Ensuite, si tu veux ajouter des éléments à un objet jQuery, tu peux passer par .add() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $( 'input[type="text"]').add('select')
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  8. #8
    Membre chevronné
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Billets dans le blog
    1
    Par défaut
    Désoler pour la faute j'ai effectivement oublier une apostrophe.

    Je pense avoir compris. Est ce que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $( 'input[type="text"]', select )
    est égal à

    $( select ).on( 'change', 'input[type="text"]', function( ) { /*-- --*/ } );
    avec select objet jquery.

  9. #9
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Ta question est un peu compliquée car dans le premier cas, tu parles d'un sélecteur et dans l'autre d'un gestionnaire d'événement !

    Mais si tu rajoutes le gestionnaire dans le premier code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $( 'input[type="text"]', select ).on( 'change', function( ) { /*-- --*/ } );
    Alors les deux codes produiront effectivement le même résultat mais ne font pas exactement la même chose.
    Dans le premier cas, tu récupères d'abord tous les input de type texte contenus dans l'objet jQuery select puis tu affectes à chacun un gestionnaire d'événement.
    Dans le second cas, tu fais ce que l'on appelle de la délégation d'événement, c'est à dire que tu affectes l'événement à l'objet jQuery select et lorsque cet événement intervient, tu vérifies si l'élément qui a réellement reçu l'événement est de type input texte. Cette version présente deux avantages principaux :
    • elle permet de ne déclarer qu'un seul événement (alors que dans l'autre, tu en déclares autant qu'il y a d'éléments concernés) ;
    • elle permet de pouvoir déclencher l'événement sur des éléments qui n'existaient pas au moment où le gestionnaire a été déclaré.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  10. #10
    Membre chevronné
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Billets dans le blog
    1
    Par défaut
    Merci d'avoir prit le temps de m'expliquer la subtilité et merci pour toutes ces infos. J'ai effectué recherche et test j'ai bien compris maintenant.

  11. #11
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Attention à l'écriture du sélecteur : $( "input[type='text'], select" ) ou $( "input[type='text']", "select" ) !

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  12. #12
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Ou pour ne pas s'emmêler les pinceaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $( 'input[type=text], select' )
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  13. #13
    Membre chevronné
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Billets dans le blog
    1
    Par défaut
    Arrêtez, j'ai compris je vous dis

    Nan sans déc je n'ai plus de soucis avec cette notation je l'ai réutiliser une bonne dizaine de fois depuis ce matin. Et ce sans jamais faire d'erreur de syntaxe

  14. #14
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Ou pour ne pas s'emmêler les pinceaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $( 'input[type=text], select' )
    Avec les anciennes versions de jQuery c'était une écriture dangereuse, car il doit toujours s'agir d'un texte. Je me souviens avoir eu des problèmes, c'était interprété comme un nombre. Mais je n'ai pas d'exemple sous la main.

    ÉDIT : Je crois que c'était un code avec les http://api.jquery.com/category/selec...ute-selectors/

    ***************************

    Amélioration de mon code, les inputs clonés gardent leurs valeurs. Les "input" "required" ne réclament plus une nouvelle valeur lors de la soumission du formulaire.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    <!DOCTYPE html>
    <html lang="fr" dir="ltr">
    <head>
    	<meta charset="utf-8">
    	<meta name="viewport" content="initial-scale=1.0">
    	<meta name="author" content="Daniel Hagnoul">
    	<title>Forum jQuery</title>
    	<script src="http://cdnjs.cloudflare.com/ajax/libs/headjs/0.99/head.min.js"></script>
    	<script>
    		"use strict";
     
    		head.js( 
    			"http://d3js.org/d3.v3.min.js",
    			"http://code.jquery.com/jquery-2.0.3.min.js",
    			"http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/i18n/jquery-ui-i18n.min.js",
    			"http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js",
    			"http://danielhagnoul.developpez.com/lib/dvjh/d3Base.js",
    			function(){
     
    				$( function(){
     
    					$.datepicker.setDefaults( $.datepicker.regional[ "fr" ] );
     
    					var jObjForm = $( "#formID" ),
    						ObjDateOptions = {
    							"dateFormat": "yy-mm-dd",
    							"showButtonPanel" : true
    						};
     
    					$( "input[name^='date_echeance']" ).datepicker( ObjDateOptions );
     
    					jObjForm.on( "click", ".btnCloneTr", function( event ){
     
    						$( "input[name^='date_echeance']" ).datepicker( "destroy" );
     
    						var jObj = $( this ),
    							jObjTr = jObj.parents( "tr" ),
    							jObjClone = jObjTr.clone( false ),
    							temp = [];
     
    						jObjClone
    							.find( "input[name^='date_echeance']" )
    							.removeClass( "hasDatepicker" )
    							.attr( "id", "" );
     
    						$( "input", jObjClone ).each( function( i, item ){
    							temp.push( $( item ).val() );
    							$( item ).val( "" );
    						});
     
    						jObj
    							.parents( "tbody" )
    							.append( jObjClone );
     
    						$( "input[name^='date_echeance']" ).datepicker( ObjDateOptions );
     
    						$( "input", jObjClone ).each( function( i, item ){
    							$( item ).val( temp[ i ] );
    						});
     
    						return false;
    					});
     
    					jObjForm.on( "click", ".btnRemoveTr", function(){
     
    						$( "input[name^='date_echeance']" ).datepicker( "destroy" );
     
    						$( this ).parents( "tr" ).remove();
     
    						$( "input[name^='date_echeance']" ).datepicker( ObjDateOptions );
     
    						return false;
    					});
     
    					jObjForm.on( "submit", function( event ){
    						var jObj = $( this ),
    							datas = jObj.serialize(), // contenu des éléments du form ayant un attribut name
    							total = 0;
     
    						// calcul du montant total
    						$( "input[name^='mont']", jObj ).each( function( i, item ){
    							total += parseFloat( $( item ).val() );
    						});
     
    						datas += "&total=" + total;
     
    						// debug console touche F12
    						console.log( datas );
     
    						// code de la transaction AJAX
     
    						return false;
    					});
     
    				});
     
    				$( window ).load( function(){
     
    				});
    			}
    		);
    	</script>
    	<link href='http://fonts.googleapis.com/css?family=Sofia|Ubuntu:400|Kreon'>
    	<link rel="stylesheet" href="http://danielhagnoul.developpez.com/styles/dvjhRemBase.css">
    	<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/themes/sunny/jquery-ui.min.css">
    	<style>
    		/* TEST -- Nota bene : ici 1 rem est égal à 1 px, voir dvjhRemBase.css */
     
    		table.maTable {
    		    margin: 2.5rem;
    		    padding: 2.5rem;
    		    background: #EEEEEE;
    		}
     
    		table.maTable tr {
    		    margin: 2.5rem;
    		    background: rgba(255,128,0,0);
    		}
     
    		table.maTable td {
    		    width: 8rem;
    		    height: 8rem;    
    		    text-align: center;
    		    vertical-align: center;
    		}
     
    		table.maTable td button	{ width: 7em; }
     
    	</style>
    </head>
    <body>
    	<header>
    		<hgroup>
    			<h1>Forum jQuery</h1>
    			<h2>
    				<a href="">Lien</a>
    			</h2>
    		</hgroup>
    	</header>
    	<section class="conteneur">
     
    <form id="formID">
     
    	<label>Numero Facture</label>
    	<input type="text" name="num_fac" required>
     
    	<table class="maTable">
    		<thead>
    			<tr>
    				<th>Montant</th>
    				<th>Date Echeance</th>
    				<th>Actions</th>
    			</tr>
    		</thead>
    		<tbody>
    			<tr>
    				<td>
    					<input type="text" name="mont[]" required>
    				</td>
    				<td>
    					<input type="text" name="date_echeance[]" required>
    				</td>
    				<td>
    					<button class="btnCloneTr">Cloner</button>
    					<button class="btnRemoveTr">Supprimer</button>
    				</td>
    		 	</tr>
    			<tr>
    				<td>
    					<input type="text" name="mont[]" required>
    				</td>
    				<td>
    					<input type="text" name="date_echeance[]" required>
    				</td>
    				<td>
    					<button class="btnCloneTr">Cloner</button>
    					<button class="btnRemoveTr">Supprimer</button>
    				</td>
    			</tr>			
    		</tbody>
    	</table>
     
    	<input type="submit" value="Envoyer">
    </form>
     
    	</section>
    	<footer itemscope itemtype="http://danielhagnoul.developpez.com/">
    		<time datetime="2013-07-31T20:20:45.811+02:00" pubdate>2013-07-31T20:20:45.811+02:00</time>
    		<span itemprop="name">Daniel Hagnoul</span>
    		<a href="http://www.developpez.net/forums/u285162/danielhagnoul/" itemprop="url">@danielhagnoul</a>
    		<a href="http://danielhagnoul.developpez.com/" itemprop="url">Mon cahier d’exercices</a>
    		<a href="http://javascript.developpez.com/faq/jquery/" itemprop="url">FAQ</a>
    		<a href="http://javascript.developpez.com/cours/?page=frameworks#jquery" itemprop="url">Tutoriels</a>
    	</footer>
    </body>
    </html>

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  15. #15
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    bonjour ,
    merci de votre aide , j'ai ajouter une classe dans mes input cela fonctionne bien mais j'ai un autre problème.

    bon je balance mes code pour mieux vous expliquer ce que je veux faire

    mon formulaire
    Code html : 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
     
    <form method="post" action="acceuil.php">
    			<!-- test table 2 -->
    			<label>Numero Facture</label>
    			<input type="text" required="required"   name="num_fac"  class="auto" /><span class="info"></span> 
    			<table  id="table2" border="1">
    				<tr>
    					<th></th>
    					<th>Montant</th>
    					<th>Date Echeance</th>
    					<td><img src="images/add.png" class="cloneTableRows" /></td>
    				</tr>
     
    				<tr>
    						<td><img src="images/del.png" alt="" class="delRow" style="visibility: hidden;" /></td>
    						<td><input type="text"   class="montant" required="required"   name="mont[]" />   </td>
    						<td><input type="text"  required="required"  name="date_echeance[]" class="my_date" /></td>
     
    					  <td></td>
     
    				</tr>
    					<tr>
    						<td><img src="images/del.png" alt="" class="delRow" style="visibility: hidden;" /></td>
    						<td><input type="text"    class="montant"  required="required"   name="mont[]" /></td>
    						<td><input type="text"  required="required"  name="date_echeance[]" class="my_date" /></td>
     
    					  <td></td>
    				</tr>
     
    			</table>
    			<span class="montantvalide"></span>
    			<input  id="buttonform" type="submit" name="button_echeance" value="valider" />
     
    			 </form>

    dans cette formulaire j'ai un input pour la saisi des numero des facture qui est en dehors du tableau

    j'ai un tableau qui qui contient des inputs pour la saisi des montants et dates du facture donc ces montant et dates dépendent du numéro de facture et je peux en créer au tant que je veux .

    maintenant j'ai deux teste a faire : le premier est sur le input numéro facture en en utilisant la fonction blur de jquery (qui va verifier si le numéro de facture est correcte
    la deuxième est sur la somme des montants des facture (c'est à dire je vérifie si la somme des montants saisis n est supérieur au montant du facture ).

    ici pour pour le test (c'est dire sur input facture j'ai pas de probleme ce la marche bien mais je me bloque au deuxième test

    voici mon script js
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
     
    /***    recuperer la valeur du numero factrure verifier si elle existe dans  la  base de données                **/
     
    		$(".auto").blur(function(){ 
    		var facture=($(this).attr("name")); 
    		var value=($(this).attr("value")); 
    		var info_form=$(this).next(".info"); 
     
    		if(facture=="num_fac") 
    		{ 
    			$.ajax({ 
    					type: "GET", 
    					url: "verif_facture.php?facture="+value, 
    					success:function(data){ 
    					if(data==1) 
    				   { 
     
    						info_form.append("<span style='color:green'>valide</span>"); 
    					} 
    					 else 
    					{ 
    					 info_form.append("<span style='color:red'>invalide</span>"); 
     
    					 } 
    				  } 
    		  }); 
     
    		} 
     
    		});		
     
     
    // mise  à jour  en line
     
     
    /*** verifier le total du montant  saisi                 **/
    $(".montant,  .auto").blur(function(){
       var facture=($(this).attr("name"));
     
    		var value=($(this).attr("value")); 
    	//var mont= ($(this).attr("name"));
       var somme = 0;
          var montant_valide=$(this).next(".montantvalide");
       $('.montant').each( function() {
     
            somme +=parseFloat($(this).val());
       });
       if(facture=="num_fac") 
    		{ 
    			$.ajax({ 
    					type: "GET", 
    					url: "verif_montant.php?facture="+value+"&montant="+somme, 
    					success:function(data){ 
    					if(data==1) 
    				   { 
    					alert(somme); 
    				  } else
    				    {
    					  alert("erreur");
    					  }
                     }				  
    		  }); 
     
    		}
     
        // 
     //  montant_valide.append(somme);
    });
    mon prbleme se pose sur cette parti
    $(".montant, .auto").blur(function(){
    si je met seulement la classe auto se la passe bien en me generant une erreur
    mais par contre la classe montant rien ne se passe
    code verif_facture.php
    Code php : 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
     
    if(isset($_GET["facture"])) 
    { 
    $facture=$_GET["facture"]; 
         $connect=mysql_connect('localhost','root','');
                mysql_select_db('test');
     
     
    $req_pseudo_exist="select facnumber FROM llx_facture where facnumber='".$facture."'"; 
    $pseudo_exist=mysql_query($req_pseudo_exist); 
    if(mysql_num_rows($pseudo_exist)>0) 
    { 
    echo "1"; 
    } 
    else 
    { 
    echo "0"; 
    } 
    mysql_close(); 
    } 
    else 
    { 
    echo "non non !"; 
    }
    code verif_montant.php
    Code php : 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
     
    if(isset($_GET["facture"])) 
    { 
    $facture=$_GET["facture"]; 
    $somme =$_GET["montant"];
         $connect=mysql_connect('localhost','root','');
                mysql_select_db('test');
     
     
    $req_montant="select total_ttc as total  FROM llx_facture where facnumber='".$facture."'"; 
    $reqmontant=mysql_query($req_montant); 
         $datamontant=mysql_fetch_array($reqmontant);
    	   $montant=$datamontant['total'];
     
     
    if($somme>$montant) 
    { 
    echo "0"; 
    } 
    else 
    { 
    echo "1"; 
    } 
     
    mysql_close(); 
    } 
    else 
    { 
    echo "non non !"; 
    }
    merci d'avance

  16. #16
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    bonjour , j'avance de petit à petit , j'ai modifier mon code ça à l'air fonctionner
    code javascript
    Code javascript : 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
     
     
    /*** verifier le total du montant  saisi                 **/
    $('.montant').blur(function(){
     
       var facture=($(".auto").attr("name"));
       var value = $(".auto").val();
    	//	var value=($(this).attr("value")); 
    	//var mont= ($(this).attr("name"));
       var somme = 0;
          var montant_valide=$(this).next(".montantvalide");
       $('.montant').each( function() {
     
            somme +=parseFloat($(this).val());
       });
       if(facture=="num_fac") 
    		{ 
    			$.ajax({ 
    					type: "GET", 
    					url: "verif_montant.php?facture="+value+"&montant="+somme, 
    					success:function(data){ 
    					if(data==0) 
    				   { 
    					alert(somme); 
    				   } 
            }				  
    		  }); 
     
    		}
     
        // 
     //  montant_valide.append(somme);
    });

    code php verif_montant.php
    Code php : 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
     
    if(isset($_GET["facture"])) 
    { 
    $facture=$_GET["facture"]; 
    $somme =$_GET["montant"];
         $connect=mysql_connect('localhost','root','');
                mysql_select_db('test');
     
     
    $req_montant="select total_ttc as total  FROM llx_facture where facnumber='".$facture."'"; 
    $reqmontant=mysql_query($req_montant); 
         $datamontant=mysql_fetch_array($reqmontant);
    	   $montant=$datamontant['total'];
     
     
    if($somme>$montant) 
    { 
    echo "0"; 
    } 
     
     
    mysql_close(); 
    } 
    else 
    { 
    echo "non non !"; 
    }

    mon autre souci est même si la somme n'est pas supérieur au montant ça génère le boite de dialogue je veux juste générer la boite dialogue au cas ou la somme est supérieur au montant dans l'autre(somme inférieur au montant ) ne rien générer pour me laisser soumettre mon formulaire

    merci d'avance

  17. #17
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    j'ai résolu mon problème et merci beaucoup de votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/02/2015, 21h23
  2. Calcul automatique dans un tableau dynamique
    Par samiker dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/12/2014, 00h17
  3. [WD14] Calcul sur champs de tableau croisé dynamique
    Par KOUADIO SEVERIN dans le forum WinDev
    Réponses: 2
    Dernier message: 08/06/2012, 12h54
  4. calcul dynamique avec radio et input
    Par thierry7878 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 29/01/2011, 10h15
  5. [VBA-E]Ligne calculée en fin de tableau dynamique
    Par AliochaBada dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 07/10/2006, 22h23

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