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 :

Variation de valeur formulaire en fonction de boutons et cases


Sujet :

jQuery

  1. #21
    Futur Membre du Club Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Si je reprend mon code de départ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <div class="creditcard-content">
     
    									<button type="submit" class="btn btn-lg btn-primary submit-button mb20" data-loading-text='<i class="fa fa-spinner fa-spin"></i> Submitting...' data-complete-text='<i class="fa fa-check"></i> Paiement effectu&eacute; !' <?php echo $allow_submit ? '' : 'disabled'; ?>>
     
    							<span class="total <?php echo !empty($total) ? 'show' : ''; ?>">Total: <?php echo currencySymbol(); ?><span><?php echo $total; ?></span> <small><?php echo currencySuffix(); ?></small></span>
     
    										<i class="fa fa-check"></i> Faire le paiement
    									</button>
     
    								</div>
    Ceci est mon bouton de paiement.

    Nom : Screensghjghhhot_1.jpg
Affichages : 254
Taille : 21,8 Ko

    Par rapport à mon code de départ js, on est passé de ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // show total amount on button
            $('select[name="item_id"]').on('change', function() {
                var total = parseFloat($('select[name="item_id"] option:selected').attr('data-price')).toFixed(2);
                updateTotal(total);
            });
            $('input[name="amount"]').on('blur', function() {
                var total = parseFloat($(this).val()).toFixed(2);
                updateTotal(total);
            });
    à celui-ci :

    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
    const myForm = document.querySelector('#order_form')
     
        myForm.onsubmit=e=>{
          e.preventDefault()  // juste pour le test
          }
        myForm.onreset=_=>{
          myForm.Total.innerText = '100'
          }  
         myForm.onchange=_=>{
          let myTotal    = Number(myForm['item_id'].value) * Number(myForm.quality.value)
            , OptPercent = Array.from(myForm.querySelectorAll('.option:checked'))      // calcul de la somme des pourcentages 
                                .reduce((sum,opt)=>sum+=Number(opt.value),0)          //   à appliquer par les options
            , OptionsVal = myTotal * OptPercent / 100                                // la regle de troie, sans cheval
     
          myTotal += OptionsVal
     
          myForm.Total.innerText = '€ '+ myTotal.toFixed(2)
     
          }
    le but étant d'intégrer des boutons radio et des cases à cocher en incrémentant la valeur en direct sur le bouton et valider le paiement avec la fonction paymentIntent, ce qui actuellement ne 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
    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
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    var stripe = null;
     
    	var cardElement = null;
     
    var app = {
     
        /*
         * init is where we initialize everything
         */
        init: function() {
     
     
            this.addValidation();
            this.bootstrap();
            this.tableSearch();
            this.paymentPage();
            this.checkNotification();
        },
     
        /******************************************************
         *
         ******************************************************/
     
         /*
        * setup our payment page
        */
        paymentPage: function() {
     
    		if($('.publishable-key').val() != ''){
    			stripe=Stripe($('.publishable-key').val());
    			var elements = stripe.elements();
    			cardElement=elements.create('card');
    			cardElement.mount('#card-element');
    		}
     
     
            $('input:text:visible:first').focus();
     
            // show hide the recurring notice
            $('input[name="payment_type"]').on('change', function() {
                var type = $('input[name="payment_type"]:checked').val();
                if ( type == 'recurring' ) {
                    $('.recurring-alert').show();
     
                    var enableSubscriptions = $('.enable-subscriptions').val();
     
                    if ( enableSubscriptions == 'stripe_only' ) {
                        $('input[name="payment_method"][value="creditcard"]').click();
                        $('input[name="payment_method"][value="paypal"]').prop('disabled', true);
                    }
                    if ( enableSubscriptions == 'paypal_only' ) {
                        $('input[name="payment_method"][value="paypal"]').click();
                        $('input[name="payment_method"][value="creditcard"]').prop('disabled', true);
                    }
     
     
                } else {
                    $('.recurring-alert').hide();
                    $('input[name="payment_method"]').prop('disabled', false);
                }
            });
     
            // show hide the proper payment details
            $('input[name="payment_method"]').on('change', function() {
                var method = $('input[name="payment_method"]:checked').val();
                $('.stripe-length-text, .paypal-length-text').hide();
                if ( method == 'paypal' ) {
                    $('.paypal-content').show();
                    $('.creditcard-content').hide();
                    $('.paypal-length-text').show();
                } else {
                    $('.paypal-content').hide();
                    $('.creditcard-content').show();
                    $('.stripe-length-text').show();
                }
            });
     
            // show hide the recurring notice
            $('input[name="name"]').on('blur', function() {
                $('input[data-stripe="name"]').val($(this).val());
            });
     
            // show proper card type image on keyup
            $('.card-number').on('keyup', function() {
                var number = $(this).val();
                var type = app.getCardType(number);
                $('.card-type-image').removeClass('visa mastercard amex discover none').addClass(type);
            });
     
     
     
     
     
            var updateTotal = function(total) {
                if ( !isNaN(total) ) {
                    $('.submit-button .total span').html(total);
                    $('.submit-button .total').css('display', 'block');
                } else {
                    $('.submit-button .total').css('display', 'none');
                }
     
    			paymentIntent();
            }
     
    		var paymentIntent = function(){
    			console.log("Payment intent called");
    			let vamount=0.00;
     
    			if($('select[name="item_id"]').length > 0){
    				vamount=parseFloat($('select[name="item_id"] option:selected').attr('data-price')).toFixed(2);
    				console.log(vamount);
    			}
    			if($('#order_form input[name="amount"]').length > 0){
    				vamount=parseFloat($('input[name="amount"]').val()).toFixed(2);
    				console.log("coiso tal");
    			}
    			if($('#invoice-amount').length > 0){
    				vamount=parseFloat($('#invoice-amount').text()).toFixed(2);
    				console.log("tal");
    			}
     
    			vamount=Math.round(vamount*100);
    			if(isNaN(vamount)){
    				vamount=0.00;
    			} 
     
    			console.log(vamount);
     
    			let type=$('input[name=payment_type]:checked').val();
     
    			let url=$('#order_form').attr('action');
     
    			let data={
    				amount:vamount
    			};
     
    			if($("#payment_intentsk").val() !== ''){
    				data.payment_intentsk = $("#payment_intentsk").val();
    			}
     
    			$.post(url+"?action=create_intent", data , function(data, status){
    				if(status==="success"){
    					$("#payment_intentsk").val(data.message.client_secret);
    				} 
    			});
    		}
     
    		if($('#invoice-amount').length > 0){
    			paymentIntent();			
    		}
     
            // show total amount on button
            $('select[name="item_id"]').on('change', function() {
                var total = parseFloat($('select[name="item_id"] option:selected').attr('data-price')).toFixed(2);
                updateTotal(total);
            });
            $('input[name="amount"]').on('blur', function() {
                var total = parseFloat($(this).val()).toFixed(2);
                updateTotal(total);
            });
     
            // update paypal form on paypal button click
            $('.paypal-button').on('click', function(e) {
                e.preventDefault();
                if ( $('#order_form').valid() ) {
                    // set button to loading
                    $('.paypal-button').button('loading');
     
                    // get amount and description
                    var amount = 0;
                    var description = '';
                    if ( $('#order_form select[name="item_id"]').length ) {
                        amount = $('#order_form select[name="item_id"] option:selected').attr('data-price');
                        description = $('#order_form select[name="item_id"] option:selected').attr('data-name');
                    } else if ( $('#order_form input[name="amount"]').length ) {
                        amount = $('#order_form input[name="amount"]').val();
                        description = $('#order_form textarea[name="description"]').val();
                        description = description ? description : 'PayPal Payment';
                    }
                    // serialize our form data
                    var formData = $('#order_form').serialize();
                    // remove undeeded data from string
                    formData = formData.replace(/(&?amount=[^&]*|&?description=[^&]*|&?action=[^&]*|&?payment_type=[^&]*|&?payment_method=[^&]*)/g, '');
                    formData = formData.replace(/^&/, '');
                    // add form data to custom input field
                    $('.paypal-form input[name="custom"]').val(formData);
     
     
                    // only update values if we dont' have invoice
                    if ( !$('input[name="invoice_id"]').length ) {
                        if ( $('input[name="payment_type"]:checked').val() == 'recurring' ) {
                            $('#paypal_form_recurring input[name="a3"]').val(amount);
                            $('#paypal_form_recurring input[name="item_name"]').val(description);
                        } else {
                            $('#paypal_form_one_time input[name="amount"]').val(amount);
                            $('#paypal_form_one_time input[name="item_name"]').val(description);
                        }
                    }
     
                    // submit proper form now
                    if ( $('input[name="payment_type"]:checked').val() == 'recurring' ) {
                        $('#paypal_form_recurring').submit();
                    } else {
                        $('#paypal_form_one_time').submit();
                    }
                }
            });
     
            // show success message on paypal success return
            if ( $.jGet('status') == 'paypal_success' ) {
                app.response = 'Your PayPal payment has been received, you should receive a confirmation email shortly.';
                $('.submit-button').button('complete');
                setTimeout(function() {
                    $('.submit-button').prop('disabled', true).removeClass('btn-primary').addClass('btn-default colorsuccess');
                    app.showSuccess();
                }, 10);
            }
            if ( $.jGet('status') == 'paypal_subscription_success' ) {
                app.response = 'Your PayPal subscription has been created successfully, you should receive a confirmation email shortly.';
                $('.submit-button').button('complete');
                setTimeout(function() {
                    $('.submit-button').prop('disabled', true).removeClass('btn-primary').addClass('btn-default colorsuccess');
                    app.showSuccess();
                }, 10);
            }
     
     
        },
     
        /*
        * setup our bootstrap functionality
        */
        bootstrap: function() {
     
            $('[data-toggle="tooltip"]').tooltip({html: true});
            $('[data-toggle="popover"]').popover();
     
            if ( $('.nav-tabs').length ) {
                if ( $.jGet('tab') ) {
                    $('.nav-tabs a[href="#' + $.jGet('tab') + '"]').tab('show');
                } else {
                    $('.nav-tabs a:first').tab('show');
                    if ( $('.nav-tabs.hash-tabs').length ) {
                        window.location.hash = '#tab=' + $('.nav-tabs.hash-tabs a:first').attr('href').substr(1);
                    }
                }
                $('.hash-tabs a[data-toggle="tab"]').off('shown.bs.tab').on('shown.bs.tab', function(e) {
                    window.location.hash = '#tab=' + e.target.hash.substr(1);
                });
            }
     
            // show last settings pane if it's set
            if ( localStorage.activePill ) {
                $('.nav-pill-control > li').removeClass('active');
                $('.nav-pill-control > li > a[href="' + localStorage.activePill + '"]').parent().addClass('active');
                $('.nav-pill-pane').hide();
                $(localStorage.activePill).show();
            }
     
            $('[data-hide]').on('click', function() {
                if ( $(this).parent().hasClass('modal-header') ) {
                    $('#' + $(this).attr('data-hide')).modal('hide')
                } else {
                    $(this).closest('.' + $(this).attr('data-hide')).hide();
                }
            });
     
            $('#add_item, #create_invoice').on('shown.bs.modal', function(e) {
                $(this).find('input:text:first').focus();
            });
     
            $('#edit_item').on('show.bs.modal', function(e) {
                var $tr = $(e.relatedTarget).closest('tr');
                $('#edit_item input[name="id"]').val($tr.attr('data-item-id'));
                $('#edit_item input[name="name"]').val($tr.attr('data-item-name'));
                $('#edit_item input[name="price"]').val($tr.attr('data-item-price'));
            });
     
            $('.datepicker').datepicker();
     
            $('.confirm-click').on('click', function(e) {
                e.preventDefault();
                $this = $(this);
                var text = $this.attr('data-text') ? $this.attr('data-text') : 'Yes, delete it!';
                swal({
                    title: 'Are you sure?',
                    text: 'This action cannot be undone.',
                    type: 'warning',
                    showCancelButton: true,
                    confirmButtonClass: 'btn-danger',
                    confirmButtonText: text,
                    closeOnConfirm: false
                }, function() {
                    window.location = $this.attr('href');
                });
     
            });
     
     
            $('.nav-pill-control a').on('click', function(e) {
                e.preventDefault();
                $('.nav-pill-control > li').removeClass('active');
                $(this).parent().addClass('active');
                $('.nav-pill-pane').hide();
                $($(this).attr('href')).show();
                localStorage.activePill = $(this).attr('href');
            });
     
            $('.maxlength[maxlength]').maxlength({
                alwaysShow: false,
                threshold: 20,
                showCharsTyped: true,
                placement: 'bottom',
                warningClass: 'label label-success',
                limitReachedClass: 'label label-danger',
                separator: ' of ',
                validate: true
            });
     
     
        },
     
        /*
        * table search
        */
        tableSearch: function() {
     
            // live filter searching
            $('input.filter').on('keyup', function() {
                var $table = $(this).closest('.tab-pane').find('table');
                var rex = new RegExp($(this).val(), 'i');
                $table.find('tbody tr').hide();
                $table.find('tbody tr').filter(function() {
                    return rex.test($(this).text());
                }).show();
                if ( $table.find('tbody tr:visible').length === 0 ) {
                    $table.find('tbody').next('tfoot').show();
                } else {
                    $table.find('tbody').next('tfoot').hide();
                }
            });
     
        },
     
        /*
         * Add our jquery form validation here
         */
        addValidation: function() {
            $('form.validate').each(function() {
                $(this).validate({
                    errorClass: 'validate-error control-label',
                    validClass: 'validate-valid control-label',
                    ignore: 'select:hidden:not(.selectpicker), input:hidden, textarea:hidden',
                    errorPlacement: function(error, element) {
                        if ( element.is('input:checkbox') || element.is('input:radio') ) {
                            var lastElement = $('[name="' + element.attr('name') + '"]:last');
                            lastElement = element.parent().hasClass('icheck') ? lastElement.closest('label') : lastElement;
                            error.insertAfter(lastElement.parent().is('label') ? lastElement.parent() : lastElement);
                        } else {
                            if ( element.closest('.input-group').length == 1 ) {
                                error.insertAfter(element.closest('.input-group'));
                            } else {
                                error.insertAfter(element);
                            }
                        }
                    },
                    highlight: function(element, errorClass, validClass) {
                        if ( $(element).closest('.form-group').length == 1 ) {
                            $(element).closest('.form-group').addClass('has-error');
                        } else {
                            $(element).addClass('validate-error');
                        }
                    },
                    unhighlight: function(element, errorClass, validClass) {
                        if ( $(element).closest('.form-group').length == 1 ) {
                            $(element).closest('.form-group').removeClass('has-error');
                        } else {
                            $(element).removeClass('validate-error');
                        }
                    },
                    /*onkeyup: function(element, event) {
                        if ( !$(element).hasClass('check-email') ) {
                            $(element).valid();
                        }
                    },*/
                    onfocusout: function(element, event) {
                        if ( !$(element).hasClass('check-email') && $(element).attr('aria-invalid') ) {
                            $(element).valid();
                        }
                    },
                    invalidHandler: function(event, validator) {
                        // this fires if the form didn't pass validatation
                    },
                    submitHandler: function(form,event) {
    					event.preventDefault();
                        app.submitForm(form);
                    }
                });
            });
     
        },
     
     
        /*
         * handle a form submission
         */
        submitForm: function(form) {
            $form = $(form);
     
            // prevent disabled form from submission
            if ( $form.hasClass('disabled') ) {
                return false;
            }
     
            // check for paypal method
            if ( $('input[name="payment_method"]:checked').val() == 'paypal' ) {
                $('.paypal-button').click();
                return false;
            }
     
            // set our button to loading state
            $button = $form.find('.btn[data-loading-text]:visible:last');
            $button.button('loading');
     
            if ( $form.attr('id') == 'order_form' ) {
                // hide errors first
                $('.error-alert').hide();
     
    			let ptype=$('input[name=payment_type]:checked').val();
     
    			if(ptype==='recurring'){
     
    				stripe.createToken(cardElement).then(function(result) {
    					if (result.error) {
    						// Inform the customer that there was an error.
    						app.response = result.error.message;
    						app.showError();
    						$button.button('reset');
    						return false;
    					} else {
    					  // Send the token to your server.
    					  console.log(result);
     
    						$form.ajaxSubmit({
    								data: {
    									token:result.token,
    									source:result.token.id
    								},
    								beforeSubmit: function() {
    								},
    								error: function(jqXHR, textStatus, errorThrown) {
    									// set our response and show error
    									app.response = jqXHR.responseText;
    									app.showError();
    									// reset the button state now
    									$button.button('reset');
    								},
    								success: function(data) {
    									// set the global response value
    									app.response = data.message;
    									// reset the button state now
    									$button.button('reset');
    									if ( data.status ) {
    										// disable the current form and button
    										$('#order_form').addClass('disabled');
    										$button.button('complete');
    										setTimeout(function() {
    											$button.prop('disabled', true).removeClass('btn-primary').addClass('btn-default colorsuccess');
    										}, 10);  
    										$('input[name="payment_method"]').prop('disabled', true);  
    										app.showSuccess();
    									} else {
    										app.showError();
    									}
    								}
    						});
     
    					}
    				});
     
    			}
    			else {
     
    				let clientSecret=$("#payment_intentsk").val();
     
    					stripe.handleCardPayment(
    						clientSecret, cardElement, {
    						  payment_method_data: {
    							billing_details: {name: $("input[name='name']").val()}
    						  }
    						}
    					  ).then(function(result) {
    						if (result.error) {
    							app.response = result.error.message;
    							app.showError();
    							$button.button('reset');
    							return false;
    						} else {
     
    							$form.ajaxSubmit({
    								data: {
    									paymentintentid: result.paymentIntent.id
    								},
    								beforeSubmit: function() {
    								},
    								error: function(jqXHR, textStatus, errorThrown) {
    									// set our response and show error
    									app.response = jqXHR.responseText;
    									app.showError();
    									// reset the button state now
    									$button.button('reset');
    								},
    								success: function(data) {
    									// set the global response value
    									app.response = data.message;
    									// reset the button state now
    									$button.button('reset');
    									if ( data.status ) {
    										// disable the current form and button
    										$('#order_form').addClass('disabled');
    										$button.button('complete');
    										setTimeout(function() {
    											$button.prop('disabled', true).removeClass('btn-primary').addClass('btn-default colorsuccess');
    										}, 10);  
    										$('input[name="payment_method"]').prop('disabled', true);  
    										app.showSuccess();
    									} else {
    										app.showError();
    									}
    								}
    							});
     
    						}
    					});
    			}
     
     
            } else if ( $form.attr('id') == 'install_form' ) {
     
                // submit form now
                $form.ajaxSubmit({
                    beforeSubmit: function() {
                    },
                    error: function(jqXHR, textStatus, errorThrown) {
                        // set our response and show error
                        app.response = jqXHR.responseText;
                        app.showError();
                        // reset the button state now
                        $button.button('reset');
                    },
                    success: function(data) {
                        if ( data.status ) {
                            $form.slideUp(function() {
                                $('.install-success').slideDown();
                            });
                        } else {
                            // reset button
                            $button.button('reset');
                            // show message
                            app.response = data.message;
                            app.showError();
                        }
                    }
                });
     
            } else {
     
                form.submit();
            }
            return false;
        },
     
        showSuccess: function() {
            swal({
                title: 'Thank You!',
                text: app.response,
                type: 'success',
                showCancelButton: true,
                confirmButtonClass: 'btn-primary',
                confirmButtonText: 'Make Another Payment',
                cancelButtonText: 'Close',
                closeOnConfirm: false,
                closeOnCancel: true
            },
            function(isConfirm) {
                if ( isConfirm ) {
                    url = document.URL.replace(/(\?|#).*/, '');
                    window.location = url;
                }
            });
        },
     
        showError: function() {
            swal({
                title: 'Oh Snap!',
                text: app.response,
                type: 'error',
                showCancelButton: false,
                confirmButtonClass: 'btn-default',
                confirmButtonText: 'Close',
                cancelButtonText: 'Close',
                closeOnConfirm: true,
                closeOnCancel: true
            });
        },
     
        getCardType: function(number) {
            var re = new RegExp('^4[0-9]');
            if (number.match(re) != null) {
                return 'visa';
            }
            re = new RegExp('^3[47][0-9]');
            if (number.match(re) != null) {
                return 'amex';
            }
            re = new RegExp('^5[1-5][0-9]');
            if (number.match(re) != null) {
                return 'mastercard';
            }
            re = new RegExp('^6(?:011|5[0-9]{2})[0-9]');
            if (number.match(re) != null) {
                return 'discover';
            }
            return 'none';
        },
     
        checkNotification: function() {
            // check api for notifications if we're on admin page
            if ( $('.notification-header').length && checkNotification ) {
                $.ajax({
                    url: 'http://api.devinlewis.com/payment-system-notification',
                    data: {source: 'customer'},
                    dataType: 'jsonp',
                    jsonp: 'notificationCallback'
                });
            }
            // disable the notification
            $('.disable-notification').on('click', function(e) {
                e.preventDefault();
                $.ajax({
                    url: 'process.php?action=disable_notification'
                });
                $('.notification-header').remove();
            });
        },
     
        response: ''
     
     
    };
     
    /*
    * jsonp function to handle api callback
    */
    var notificationCallback = function(data) {
        if ( data.display ) {
            if ( data.prevent_disable ) {
                $('.disable-notification').hide();
            }
            $('.notification-alert').addClass(data.alert);
            $('.notification-message').html(data.message);
            $('.notification-header').show();
        }
    };
     
    /*
     * launch everything on document ready
     */
    $(function() {
        app.init();
    });
    mon idée est d'incorporer la fonction updateTotal sur le total de ton code, j'ai essayé de feinté... sans succès

    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
    const myForm = document.querySelector('#order_form')
     
        myForm.onsubmit=e=>{
          e.preventDefault()  // juste pour le test
          }
        myForm.onreset=_=>{
          myForm.Total.innerText = '100'
          }  
         myForm.onchange=_=>{
          let myTotal    = Number(myForm['item_id'].value) * Number(myForm.quality.value)
            , OptPercent = Array.from(myForm.querySelectorAll('.option:checked'))      // calcul de la somme des pourcentages 
                                .reduce((sum,opt)=>sum+=Number(opt.value),0)          //   à appliquer par les options
            , OptionsVal = myTotal * OptPercent / 100                                // la regle de troie, sans cheval
     
          myTotal += OptionsVal
     
          myForm.Total.innerText = '€ '+ myTotal.toFixed(2)
     
          }
     
    $('select[name="item_id"]').on('change', function() {
        var total = myForm.Total.innerText;
    	updateTotal(total);
            });
    par contre si je supprime votre code et que je remet celui d'origine le paiement fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     // show total amount on button
            $('select[name="item_id"]').on('change', function() {
                var total = parseFloat($('select[name="item_id"] option:selected').attr('data-price')).toFixed(2);
                updateTotal(total);
            });

    Edit : On dirait que le document à le focus sur cette fonction, on peut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     // show total amount on button
            $('select[name="item_id"]').on('change', function() {
                var total = 100.00;
                updateTotal(total);
            });
    Ca fonctionne.

    Mais si je fais :

    [CODE]
    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
    const myForm = document.querySelector('#order_form')
     
        myForm.onsubmit=e=>{
          e.preventDefault()  // juste pour le test
          }
        myForm.onreset=_=>{
          myForm.Total.innerText = '100'
          }  
         myForm.onchange=_=>{
          let myTotal    = Number(myForm['item_id'].value) * Number(myForm.quality.value)
            , OptPercent = Array.from(myForm.querySelectorAll('.option:checked'))      // calcul de la somme des pourcentages 
                                .reduce((sum,opt)=>sum+=Number(opt.value),0)          //   à appliquer par les options
            , OptionsVal = myTotal * OptPercent / 100                                // la regle de troie, sans cheval
     
          myTotal += OptionsVal
     
          myForm.Total.innerText = '€ '+ myTotal.toFixed(2)
     
     
            var total = 100.00;
    	updateTotal(total);
     
          }
    en enlevant le " $('select[name="item_id"]').on('change', function() {" puis le } , ça ne fonctionne plus...
    Bien entendu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     // show total amount on button
            $('select[name="item_id"]').on('change', function() {
                var total = 100.00;
                updateTotal(total);
            });
    doit être juste après votre code pour que ça fonctionne. Je m'arrache les cheveux

  2. #22
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut <output> n'est pas <input>
    Citation Envoyé par psychadelic
    Ça ne résout pas le problème (sur Firefox):
    Je n’avais pas lu en plein ton [edit] et notamment ceci
    (…)qui lance le reset sur le formulaire et qui ensuite lance le calcul.
    J’ai donc répondu un peu rapidement et pas sur tous les points

    Donc sachant que :
    • l'attribut value n'est pas autorisé dans un élément output ;
    • outputElement.value retourne la valeur du outputElement.textContent si existe ;
    • au chargement outputElement.defaultValue est égale à outputElement.textContent si existe ;
    • lorsque l'on met à jour le textContent, les propriétés defaultValue et value sont mises à jour.

    La fonction que j’ai mise n’a donc pas grand sens, un <output> ne se comporte pas comme un <input>, cela m’apprendra à lire la spécification en diagonale !

    Dans la mesure où l'élément <output> est destiné à afficher le résultat d'un calcul, il ne doit pas avoir de valeur par défaut sauf si celle-ci est affectée à la construction de la page côté serveur.

    On doit donc le retrouver sous sa forme la plus simple
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <output id="total"></output>
    • Dans la mesure où le formulaire ne définie pas de choix par défaut cela est suffisant.
    • Dans la mesure où le formulaire définie un choix par défaut, il faut effectivement mettre cet élément à jour sur le load de la page et dans ce cas effectivement passer par une fonction d'« upDate », sauf si déjà affecté côté serveur donc.



    Citation Envoyé par psychadelic
    si ont rafraîchi la page (F5) ce script récupère la valeur courante présente dans le output ( issu du calcul ) et en fait une nouvelle valeur par défaut fausse.
    Concernant le « refresh » avec la touche F5, tous les navigateurs n’ont pas le même comportement devant cette action, il faut donc s’en méfier. Il est donc souvent nécessaire de forcer le reset des formulaires présent dans la page.

    Par exemple, si support moderne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    window.addEventListener("load", () => {
      const elements = document.querySelectorAll("form");
      elements.forEach((elem) => elem.reset());
    });
    ou si support IE requis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    window.addEventListener("load", function() {
      const elements = document.querySelectorAll("form");
      Array.prototype.forEach.call(elements, function(elem) {
        elem.reset();
      });
    });

    Citation Envoyé par Saturos2k4
    mon idée est d'incorporer la fonction (...)
    Il faut que tu reprennes en ne considérant que l'état de changement sur le formulaire, tu devrais avoir une entrée comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $("#order_form").on('change', function() {
      // ici les différents calculs
    });

  3. #23
    Futur Membre du Club Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Merci pour ton retour NoSmoking

    Cela donnerait donc :

    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
    $("#order_form").on('change', function() {
     
         const myForm = document.querySelector('#order_form')		   
     
         myForm.onchange=_=>{
          let myTotal    = Number(myForm['item_id'].value) * Number(myForm.quality.value)
            , OptPercent = Array.from(myForm.querySelectorAll('.option:checked'))      // calcul de la somme des pourcentages 
                                .reduce((sum,opt)=>sum+=Number(opt.value),0)          //   à appliquer par les options
            , OptionsVal = myTotal * OptPercent / 100                                // la regle de troie, sans cheval
     
          myTotal += OptionsVal
     
          myForm.Total.innerText = '€ '+ myTotal.toFixed(2)
     
          var total = myTotal.toFixed(2);
          updateTotal(total);
     
          }
     
    });
    J'ai l'impression de m'être planté quelque part

  4. #24
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Il te faut rester dans le cadre de ton objet App.
    cela pourrait ressembler à
    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
    var App = {
      init: function() {
        // du code ici
      },
      paymentPage: function() {
        // fonction appelée sur change et reset du formulaire
        // regroupe les calculs et la mise à jour du champs
        var updateCalcul = function() {
          // récup. des données
          const $form = $('#order_form');
          const valeurPack = Number($form.find("[name='item_id']").val());
          const pcQuality = Number($form.find("[name^='quality']:checked").val());
          //calcul final et affichage
          const total = valeurPack * pcQuality;
          // mise à jour du champ total
          $('.submit-button .total span').text(total);
        };
        // affectation des deux événements 
        $('#order_form').on('change reset', updateCalcul);
        // mise à jour au chargment
        updateCalcul();
        // ... la suite du code
      }
    }
    Bien sûr le code de updateCalcul est à mettre en concordance avec ton HTML.

    Tu n'as pas besoin de plus !

  5. #25
    Futur Membre du Club Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Merci pour ton aide

    On ne peut pas rester sur la fonction qu'on m'avait donné? (et à même temps pour me simplifier la compréhension du code) =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    const myForm = document.querySelector('#order_form')		   
     
         myForm.onchange=_=>{
          let myTotal    = Number(myForm['item_id'].value) * Number(myForm.quality.value)
            , OptPercent = Array.from(myForm.querySelectorAll('.option:checked'))      // calcul de la somme des pourcentages 
                                .reduce((sum,opt)=>sum+=Number(opt.value),0)          //   à appliquer par les options
            , OptionsVal = myTotal * OptPercent / 100                                // la regle de troie, sans cheval
     
          myTotal += OptionsVal
     
          myForm.Total.innerText = '€ '+ myTotal.toFixed(2)
     
          }
    Si je rajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $('select[name="item_id"]').on('change', function() {
                var total = parseFloat($('select[name="item_id"] option:selected').attr('data-price')).toFixed(2);
                updateTotal(total);
            });
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $('select[name="item_id"]').on('change', function() {
                var total = 100.00;
                updateTotal(total);
            });
    juste après ça fonctionne, il faudrait juste passer la valeur de myTotal à une variable " var total = myTotal.toFixed(2) " et ça marcherait je pense

  6. #26
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Ne prend pas ombrage mais en lisant des réflexions comme celle-ci
    en enlevant le (...) , ça ne fonctionne plus...
    j'ai essayé de feinté... sans succès
    J'ai l'impression de m'être planté quelque part
    il faudrait juste passer la valeur de myTotal (...) et ça marcherait je pense
    ... j'ai quand même l'impression que tu n'as pas réfléchi simplement à ce que tu veux faire et ce indépendamment du langage utilisé et/ou de jQuery ou JS « vanilla »(*)

    Il ne suffit pas de mettre des petits bouts de code bout à bout ou en vrac pour que cela marche, même si des fois ça marche , il faut chercher à comprendre ce que l'on fait !

    L'exemple que je t'ai mis était pour moi porteur et il me semblait qu'avec un minimum d'ajustement, pour tenir compte des tes identifiants HTML et des champs à traiter, cela serait suffisant.


    Une version, possible, en JavaScript « vanilla »(*) d'une partie du contenu de ta fonction paymentPage :
    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
    paymentPage: function() {
        // mise en cache réf. <form>
        const refForm = document.forms["order_form"];
        // fonction appelée sur change et reset du formulaire
        // regroupe les calculs et la mise à jour du champs
        var updateCalcul = function(e) {
            // récup. les éléments traités
            const refPack = refForm["item_id"];
            const refQuality = refForm["quality"];
            const refOption = refForm["option[]"];
            // récup. des données
            const valeurPack = Number(refPack.value);
            const pcQuality = Number(refQuality.value);
            // calcul total options
            let pcOption = 0;
            refOption.forEach((elem) => {
                pcOption += elem.checked ? Number(elem.value) : 0;
            });
            // ajuste multiplicateur
            pcOption = 1 + pcOption / 100;
            //calcul final
            const total = valeurPack * pcQuality * pcOption;
            // mise à jour du champ total
            updateTotal(total);
        };
     
        // affichage résultat calcul dans bouton
        var updateTotal = function(total) {
            document.querySelector(".submit-button .total span").textContent = total.toFixed(2);
        }
     
        // affectation des deux événements
        refForm.addEventListener("change", updateCalcul);
        refForm.addEventListener("reset", () => setTimeout(updateCalcul, 1));
        // mise à jour au chargment
        updateCalcul();
        // la suite du code de paymentPage
        // ...
    }
    Maintenant, une version, possible, en JavaScript « with jQuery » d'une partie du contenu de ta fonction paymentPage :
    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
    paymentPage: function() {
        // mise en cache réf. <form>
        const $refForm = $('#order_form');
        // fonction appelée sur change et reset du formulaire
        // regroupe les calculs et la mise à jour du champs
        var updateCalcul = function(e) {
            // récup. les éléments traités
            const $refPack = $refForm.find("[name='item_id']");
            const $refQuality = $refForm.find("[name^='quality']:checked");
            const $refOption = $refForm.find("[name='option[]']:checked");
            // récup. des données
            const valeurPack = Number($refPack.val());
            const pcQuality = Number($refQuality.val());
            // calcul total options
            let pcOption = 0;
            $refOption.each(function() {
                pcOption += Number($(this).val()) || 0;
            });
            // ajuste multiplicateur
            pcOption = 1 + pcOption / 100;
            //calcul final et affichage
            const total = valeurPack * pcQuality * pcOption;
            // mise à jour du champ total
            updateTotal(total);
        };
     
        // affichage résultat calcul dans bouton
        var updateTotal = function(total) {
            $('.submit-button .total span').text(total.toFixed(2));
        }
     
        // affectation des deux événements
        $('#order_form').on('change', updateCalcul);
        $('#order_form').on('reset', () => setTimeout(updateCalcul, 1));
        // mise à jour au chargment
        updateCalcul();
        // la suite du code de paymentPage
        // ...
    }
    J'espère avoir été complet, je ferais juste 2 remarques :
    • je ne sais pas si les identifiants/sélecteurs sont vraiment les bons, il y aura donc sûrement des ajustements à faire ;
    • concernant setTimeout(updateCalcul, 1), cela permet de différer l'événement reset, psychadelic en a parlé.

    Maintenant à toi de jouer, il me semble que je ne peux plus faire grand chose pour toi !

    (*) JavaScript sans framework.

  7. #27
    Futur Membre du Club Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Hello, Merci pour ton retour

    ... j'ai quand même l'impression que tu n'as pas réfléchi simplement à ce que tu veux faire et ce indépendamment du langage utilisé et/ou de jQuery ou JS « vanilla »(*)
    Pour débuter j'ai l'impression que JS vanilla à l'air plus agréable à lire que JQuery, et donc à comprendre.

    "Il ne suffit pas de mettre des petits bouts de code bout à bout ou en vrac pour que cela marche, même si des fois ça marche , il faut chercher à comprendre ce que l'on fait !"
    Effectivement j'essaye d'apprendre sur le tas, c'est pas évident au début et on expérimente pleins de choses

    J'espère avoir été complet, je ferais juste 2 remarques :
    • je ne sais pas si les identifiants/sélecteurs sont vraiment les bons, il y aura donc sûrement des ajustements à faire ;
    • concernant setTimeout(updateCalcul, 1), cela permet de différer l'événement reset, psychadelic en a parlé.

    Maintenant à toi de jouer, il me semble que je ne peux plus faire grand chose pour toi !
    Je vais passer tout ça à la loupe, merci encore pour ton aide je pense que je vais trainer très souvent ici désormais, j'avais l'habitude d'aller sur siteduzero il y a des années mais l'ambiance à changé on dirait

    À très vite les gens =)

  8. #28
    Futur Membre du Club Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Hello les gens :-)

    Très bonne nouvelle !
    J'ai finalement opté pour la mise en place de Paypal pour gérer les numéro CB, en reprenant le code suivant, ça fonctionne :

    Javascript :
    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
    const myForm = document.querySelector('#order_form')
     
        myForm.onsubmit=e=>{
          e.preventDefault()  // juste pour le test
          }
        myForm.onreset=_=>{
          myForm.Total.innerText = '100'
          }  
         myForm.onchange=_=>{
          let myTotal    = Number(myForm['item_id'].value) * Number(myForm.quality.value)
            , OptPercent = Array.from(myForm.querySelectorAll('.option:checked'))      // calcul de la somme des pourcentages 
                                .reduce((sum,opt)=>sum+=Number(opt.value),0)          //   à appliquer par les options
            , OptionsVal = myTotal * OptPercent / 100                                // la regle de troie, sans cheval
     
          myTotal += OptionsVal
     
          myForm.Total.innerText = '€ '+ myTotal.toFixed(2)
     
          }
    je vais enregistrer les données en BDD, dont les options avec une virgule entre (FAIT).
    Par contre j'ai besoin de libérer "value" pour mettre un texte à la place et utiliser "data-price":

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" class="option" value="20" data-price="20" name="option[]">

    par

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" class="option" value="NOM_OPTION" data-price="20" name="option[]">

    donc à ce niveau il faut changer à cette ligne :

    Javascript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .reduce((sum,opt)=>sum+=Number(opt.value),0)
    par

    Javascript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .reduce((sum,opt)=>sum+=Number(opt.data('price')),0)
    Ok j'ai encore foiré

    EDIT : Trouvé !

    Javascript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .reduce((sum,opt)=>sum+=Number(opt.getAttribute('data-price')),0)

  9. #29
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 740
    Points
    4 740
    Par défaut
    voir => https://developer.mozilla.org/fr/doc...lement/dataset

    soit
    .reduce((sum,opt)=>sum+=Number(opt.dataset.price),0)
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  10. #30
    Futur Membre du Club Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par psychadelic Voir le message
    voir => https://developer.mozilla.org/fr/doc...lement/dataset

    soit
    .reduce((sum,opt)=>sum+=Number(opt.dataset.price),0)
    Merci c'est super utile !

    Le projet avance, j'incorpore maintenant un code promo dans le formulaire en php/mysql et javascript, ce qui donne :

    Javascript:
    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
    <script>
     
        const myForm = document.querySelector('#paymentForm')
     
        myForm.onsubmit=e=>{
          e.preventDefault()  // juste pour le test
          }
        myForm.onreset=_=>{
          myForm.Total.innerText = '€ 1.00'
          }  
        myForm.onchange=_=>{
          let myTotal    = Number(myForm['Pack-Select'].value) * Number(myForm.quality.value)
            , OptPercent = Array.from(myForm.querySelectorAll('.option:checked'))      // calcul de la somme des pourcentages 
                                .reduce((sum,opt)=>sum+=Number(opt.getAttribute('data-price')),0)          //   à appliquer par les options
            , OptionsVal = myTotal * OptPercent / 100                               // la regle de troie, sans cheval
     
          myTotal += OptionsVal 
     
          myForm.Total.innerText = '€ '+ myTotal.toFixed(2)
    	  document.cookie = "myJavascriptVar = " + myTotal.toFixed(2)
     
    	  var e = document.getElementById("item");
    	  var result = e.options[e.selectedIndex].text;
    	  document.cookie = "myJavascriptVar2 = " + result
          }
     
     
        //function to check the promo code  
        function check_code(){  
     
            //get code  
            var code = $('#code').val();  
     
            //use ajax to run the check  
            $.post("check_code.php", { code: code },  
                function(result){  
     
                //if the result is 0  
                if(result == 0){  
                    //show that the code is correct  
                    $('#Promo_code_status').html(code + ' is correct.');  
     
    				let reduction = 5;  
    				let red =  Number(myTotal * ( reduction / 100 )); 
    				myForm.Total.innerText = '€ '+ red.toFixed(2)
     
                }else if(result == 1){  
                    //show that the code is correct, but already has been used 
                    $('#Promo_code_status').html(code + ' is already used correct.');  
                }else{
                    //show that the code is not correct 
                    $('#Promo_code_status').html(code + ' is not correct.');  
                }
            });  
     
        } 
    //function to check the promo code
      </script>
    Au niveau de ma modification, en gros lors d'un clic sur un bouton, cela vérifie si le code est présent en BDD, si oui, on exécute le code suivant :

    Javascript:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
                                    var myTotal2 = myTotal; 
    				var reduction = 5;  
    				var red =  myTotal2 * reduction / 100; 
    				var discount_price = myTotal2 - red;
    				myForm.Total.innerText = '€ '+ discount_price.toFixed(2)
    Mais cela ne fonctionne pas la valeur de Total reste la même. Par contre si j'applique :

    Javascript:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    var myTotal2 = 100; 
    				var reduction = 5;  
    				var red =  myTotal2 * reduction / 100; 
    				var discount_price = myTotal2 - red;
    				myForm.Total.innerText = '€ '+ discount_price.toFixed(2)
    Là ça fonctionne le total affiché est de 95€ ! je ne sais pas où je me suis trompé...
    je n'arrive pas à réintégrer myTotal pour appliquer la promotion.

    EDIT : J'ai trouvé une parade avec les cookies :

    Javascript:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var myTotal2 = getCookie('myJavascriptVar'); 
    				var reduction = 5;  
    				var red =  myTotal2 * reduction / 100; 
    				var discount_price = myTotal2 - red;
    				myForm.Total.innerText = '€ '+ discount_price.toFixed(2)
    mais je dis pas non pour comprendre comment passer la variable myTotal correctement

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/05/2007, 13h21
  2. Réponses: 7
    Dernier message: 23/02/2007, 15h33
  3. Réponses: 4
    Dernier message: 01/08/2006, 16h12
  4. Réponses: 4
    Dernier message: 12/06/2006, 11h46
  5. Comment charger un formulaire en fonction d'un bouton radio
    Par FredKéKé dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 31/01/2006, 13h14

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