2017-04-08 2 views
0

J'ai un tableau qui répertorie toutes les factures des utilisateurs, et chaque facture contient un bouton de paiement pour leur permettre de payer la facture. J'ai actuellement une boucle qui traverse chaque facture et affiche chaque facture dans sa propre rangée, et quand un utilisateur clique sur le bouton payer le JavaScript montrera une boîte de sélection pour utiliser une carte enregistrée ou une nouvelle carte , si l'utilisateur choisit une carte enregistrée alors le JavaScript montrera l'autre boîte de sélection contenant leurs cartes sauvegardées, si la nouvelle carte est choisie alors les autres champs d'entrée seront montrés, maintenant la partie d'affichage et de cacher en sélectionnant une carte enregistrée ou nouvelle carte fonctionne UNIQUEMENT pour la toute première ligne de la table, aucune autre ligne ne fonctionne avec ce JavaScript, je suis sûr que c'est parce que JavaScript saisit ce premier identifiant et s'arrête là. Comment puis-je faire cela correctement à l'endroit où il saisit tous les identifiants et exécute le code lorsque l'utilisateur choisit une carte enregistrée ou une nouvelle carte sur chaque facture?en utilisant javascript pour saisir plusieurs ID

J'ai créé un JSFiddle pour montrer ma situation exacte, quelqu'un peut-il la modifier pour qu'elle fonctionne? J'apprécierai vraiment cela! https://jsfiddle.net/s0fbrcw6/1/

payments.blade.php

@if($payments) 
    @foreach($payments as $payment) 
     <tr> 
      <td><a href="">${{number_format(($payment->price /100), 2, '.', ' ')}}</a></td> 
      <td>{{$payment->product_name}}</td> 
      <td>{{$payment->created_at->toFormattedDateString()}}</td> 
      <td>{{$payment->created_at->addMonth()->toFormattedDateString()}}</td> 
      <td>{{$payment->reoccurring}}</td> 
      <td>{{$payment->status}}</td> 
      @if($payment->status == "Paid") 
      @else 
       <td> 
        <div class="add-payment-container"> 
         <button class="toggle-add-payment mdl-button mdl-js-button mdl-js-ripple-effect pull-right btn-info"> 
          @if($payment->reoccurring == "Yes") 
           Subscribe 
          @else 
           Pay Here 
          @endif 
         </button> 
         <div class="add-payment"> 
          </br> 
          <form action="{{'/users/payment'}}" method="post" 
           id="checkout-form"> 
           <input type="text" name="price" class="hidden" 
            value="{{$payment->price}}"> 
           <input type="text" name="productName" class="hidden" 
            value="{{$payment->product_name}}"> 
           <input type="text" name="paymentID" class="hidden" 
            value="{{$payment->id}}"> 
           <input type="text" name="reoccurring" class="hidden" 
            value="{{$payment->reoccurring}}"> 
           <div class="row"> 
            <div class="col-sm-4"> 
             <div id="paymentMethodDiv" 
              class="form-group label-floating"> 
              {!! Form::label('paymentMethod', 'Payment Method') !!} 
              </br> 
              {!! Form::select('paymentMethod', ['Saved Card'=>'Saved Card','New Card'=>'New Card'], null, ['class' => 'browser-default mdl-selectfield', 'placeholder' => 'Choose Option', 'id' => 'paymentMethod'])!!} 
             </div> 
            </div> 
            <div class="col-sm-4"> 
             <div id="savedCardsDiv" class="form-group label-floating" style="display: none;"> 
              {!! Form::label('card', 'Previous Cards') !!} 
              </br> 
              {!! Form::select('card', $cardLast4, null, ['class' => 'browser-default mdl-selectfield', 'placeholder' => 'Choose Option', 'id' => 'savedCards'])!!} 
             </div> 
            </div> 
            <div class="col-md-4"> 
             <div id="cardHolderNameDiv" class="form-group label-floating" style="display: none;"> 
              <label class="control-label">Card Holder 
               Name</label> 
              <input type="text" id="card-name" 
               class="form-control"> 
             </div> 
            </div> 
            <div class="col-md-4"> 
             <div id="cardNumberDiv" class="form-group label-floating" style="display: none;"> 
              <label class="control-label">Card Number</label> 
              <input type="text" id="card-number" 
               class="form-control"> 
             </div> 
            </div> 
           </div> 
           <div class="row"> 
            <div class="col-md-5"> 
             <div id="expirationMonthDiv" class="form-group label-floating" style="display: none;"> 
              <label class="control-label">Expiration 
               Month</label> 
              <input type="text" id="card-expiry-month" 
               class="form-control"> 
             </div> 
            </div> 
            <div class="col-md-5"> 
             <div id="expirationYearDiv" class="form-group label-floating" style="display: none;"> 
              <label class="control-label">Expiration Year</label> 
              <input type="text" id="card-expiry-year" 
               class="form-control"> 
             </div> 
            </div> 
            <div class="col-md-2"> 
             <div id="cvcDiv" class="form-group label-floating" style="display: none;"> 
              <label class="control-label">CVC</label> 
              <input type="text" id="card-cvc" 
               class="form-control"> 
             </div> 
            </div> 
           </div> 
           {{csrf_field()}} 
           <button type="submit" class="btn btn-primary pull-right">Make 
            Payment 
           </button> 
           <div class="clearfix"></div> 
          </form> 
         </div> 
        </div> 
       </td> 
      @endif 
     </tr> 


<script> 
    var paymentMethodSelect = document.getElementById('paymentMethod'); 
    paymentMethodSelect.onchange = function() { 
     if (paymentMethodSelect.value == 'Saved Card') { 
      document.getElementById("savedCardsDiv").style.display = "block"; 
      document.getElementById("cardHolderNameDiv").style.display = "none"; 
      document.getElementById("cardNumberDiv").style.display = "none"; 
      document.getElementById("expirationMonthDiv").style.display = "none"; 
      document.getElementById("expirationYearDiv").style.display = "none"; 
      document.getElementById("cvcDiv").style.display = "none"; 
     } else if (paymentMethodSelect.value == 'New Card') { 
      document.getElementById("savedCardsDiv").style.display = "none"; 
      document.getElementById("cardHolderNameDiv").style.display = "block"; 
      document.getElementById("cardNumberDiv").style.display = "block"; 
      document.getElementById("expirationMonthDiv").style.display = "block"; 
      document.getElementById("expirationYearDiv").style.display = "block"; 
      document.getElementById("cvcDiv").style.display = "block"; 
     } else { 
      document.getElementById("savedCardsDiv").style.display = "none"; 
      document.getElementById("cardHolderNameDiv").style.display = "none"; 
      document.getElementById("cardNumberDiv").style.display = "none"; 
      document.getElementById("expirationMonthDiv").style.display = "none"; 
      document.getElementById("expirationYearDiv").style.display = "none"; 
      document.getElementById("cvcDiv").style.display = "none"; 
     } 
    }; 
</script> 
+2

vraiment simple. Vous essayez d'utiliser un ID plusieurs fois sur la page. Les ID sont uniques. Utilisez une classe avec 'querySelectorAll()' à la place. – Ohgodwhy

+0

Merci pour votre réponse! Je ne savais pas ça à propos des identifiants et comment ils sont censés être uniques, vraiment bons! Alors, comment puis-je obtenir la valeur d'index pour la ligne sur laquelle on a cliqué afin de montrer le bon ensemble de divs? Pourriez-vous expliquer ou montrer un exemple? – rapid3642

Répondre

0

Conseil: utilisation jQuery. Pour des situations comme celle-ci, cela simplifie considérablement la partie de la fonction js.

jsFiddle Solution:https://jsfiddle.net/brednmuc/4/

Brève description: Éviter d'utiliser des ID HTML pour tout et juste faire des attributs qui font le plus de sens pour votre application web. Cette méthodologie vous permet de définir pratiquement un nombre illimité d'attributs dont vous pouvez masquer certains comportements. Cela évite également les conflits avec les bibliothèques que vous pouvez utiliser/intégrer avec votre projet.

code:
jQuery:

$(document).ready(function() { 
    $("select[name='paymentMethod']").change(function() { 
      var dropdownValue = $(this).val(); 
      var transactionId = $(this).parent().attr('transactionId'); 
      switch (dropdownValue) { 
      case 'Saved Card': 
       $("td[transactionId='" + transactionId + "'] div.savedCardsDiv").show(); 
       break; 
      case 'New Card': 
       $("td[transactionId='" + transactionId + "'] div.savedCardsDiv").hide(); 
       break; 
      default: 
       $("td[transactionId='" + transactionId + "'] div.savedCardsDiv").hide(); 
       break; 
      }; 

     }); 
}); 

HTML:

<table> 
<tr> 
    <td transactionId="1"> 
    <select name="paymentMethod" form="carform" class="paymentMethod"> 
     <option value="">Select your option</option> 
     <option value="Saved Card">Saved Card</option> 
     <option value="New Card">New Card</option> 
    </select> 
    <div class="savedCardsDiv" style="display: none;"> 
     <select name="savedCards" form="carform" class="savedCards"> 
     <option value="">Select your option</option> 
     <option value="Saved Card">****4242</option> 
     <option value="New Card">****5423</option> 
     </select> 
    </div> 
    </td> 
</tr> 
<tr> 
    <td transactionId="2"> 
    <select name="paymentMethod" form="carform" class="paymentMethod"> 
     <option value="">Select your option</option> 
     <option value="Saved Card">Saved Card</option> 
     <option value="New Card">New Card</option> 
    </select> 
    <div class="savedCardsDiv" style="display: none;"> 
     <select name="savedCards" form="carform" class="savedCards"> 
     <option value="">Select your option</option> 
     <option value="Saved Card">****4242</option> 
     <option value="New Card">****5423</option> 
     </select> 
    </div> 
    </td> 
</tr> 
</table>