代码之家  ›  专栏  ›  技术社区  ›  mrpatg

jQuery函数不使用条带元素触发

  •  -2
  • mrpatg  · 技术社区  · 8 年前

    我有一个表单,让用户选择付款方式。如果方法是信用卡,则会显示一个初始化的Stripe Elements表单,它们可以输入CC/EXP/ZIP数据。单击提交后,表单应首先通过验证(jQuery Validate),然后在下一页中完成从Stripe获取令牌并传递给服务器的过程。问题是,即使函数已声明,即使我正在调用它们,它们似乎没有运行,我也不知道为什么。

    var style = {
      base: {
        color: '#32325d',
        lineHeight: '24px',
        fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
        fontSmoothing: 'antialiased',
        fontSize: '16px',
        '::placeholder': {
          color: '#aab7c4'
        }
      },
      invalid: {
        color: '#fa755a',
        iconColor: '#fa755a'
      }
    };
    
    var card = elements.create('card', {style: style});
    
    // Add an instance of the card Element into the `card-element` <div>
    card.mount('#card-element');
    
    // Handle real-time validation errors from the card Element.
    card.addEventListener('keyup', function(event) {
      var displayError = document.getElementById('card-errors');
      if (event.error) {
        displayError.textContent = event.error.message;
      } else {
        displayError.textContent = '';
      }
    });
    
    
    var stripe = Stripe('');
    
    // Create an instance of Elements
    var elements = stripe.elements();
    jQuery( document ).ready(function() {
        function stripeTokenHandler(token) {
                    // Insert the token ID into the form so it gets submitted to the server
                    document.createElement('input');
                    var form = document.getElementById('payment-form');
                    var hiddenInput = document.createElement('input');
                    hiddenInput.setAttribute('type', 'hidden');
                    hiddenInput.setAttribute('name', 'stripeToken');
                    hiddenInput.setAttribute('value', token.id);
                    form.appendChild(hiddenInput);
                    alert('token id is' + token.id);
                    var token_field = jQuery("input[name='stripeToken']").val();
                    alert(token_field);
                    // Submit the form
    
                    setTimeout(form.submit(), 3000);
    
            };
        function createToken() {
            stripe.createToken(card).then(function(result) {
    
                if (result.error) {
                // Inform the user if there was an error
                var errorElement = document.getElementById('card-errors');
                errorElement.textContent = result.error.message;
                alert(result.error.message);
                } else {
                // Send the token to your server
                alert('we got the token, sending it off')
                stripeTokenHandler(result.token);
                }
            });
        };
    
        function stripeCreateToken(event){
    
            var selectVal = jQuery("#payment_type option:selected").val();
            if( selectVal !== "Credit Card" ){
                // Not CC, skip Stripe and submit the form
                alert('it failed or no credit card');
                var form = document.getElementById('payment-form');
                form.submit();
            }
            createToken(); 
        };
    
    
        jQuery('#payment_type').on('change', function () {
                var selectVal = jQuery("#payment_type option:selected").val();
                //var form = document.getElementById('payment-form');
                if( selectVal == "Credit Card" ){
                    jQuery('.check').hide();
                    jQuery('.cc').show();
    
                    jQuery("#payment-form").submit(function(e){
                        stripeCreateToken(e);
                    });
                }else{
                    jQuery('.cc').hide();
                    jQuery('.check').show();
                }
            }); 
    });
    

    奇怪的是,如果我把上面的所有内容都粘贴到控制台上,它就会工作,但我想知道我做错了什么,或者至少想知道应该往哪里看。

    1 回复  |  直到 8 年前
        1
  •  1
  •   mrpatg    8 年前

    问题是jQuery验证在Stripe完成表单提交之前启动了表单提交。我删除了 form.submit(); 从jQuery验证开始,让它启动我的条带函数,它工作得很好。