jQuery回调调用两次 [英] jQuery callback called twice

查看:176
本文介绍了jQuery回调调用两次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我按照Rails转换来执行订阅结算。在这里:

I'm following a Rails cast to implement subscription billing. It's here:

http:/ /railscasts.com/episodes/288-billing-with-stripe

我的代码几乎完全相同,但我通过一些额外的字段到Stripe。麻烦的是,当提交按钮被击中时,javascript ALWAYS中的错误消息显示错误消息...即使成功的收费。我不确定Strip是否返回触发错误的东西,或者是否有JS问题。

My code is virtually identical, though I pass some additional fields to Stripe. The trouble is, the error message in the javascript ALWAYS displays the error message when the submit button is hit... even on successful charges. I'm not sure if Strip is returning something that triggers the error, or if there's a JS problem.

jQuery ->
  Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content'))
  subscription.setupForm()

subscription =
  setupForm: ->
    $('#new_membership').submit ->
      $('input[type=submit]').attr('disabled', true)
      if $('#card_number').length
        subscription.processCard()
        false
      else
        true

  processCard: ->
    card =
      number: $('#card_number').val()
      cvc: $('#card_code').val()
      expMonth: $('#card_month').val()
      expYear: $('#card_year').val()
    Stripe.createToken(card, subscription.handleStripeResponse)

  handleStripeResponse: (status, response) ->
    if status == 200
      $('#membership_stripe_card_token').val(response.id)
      $('#new_membership')[0].submit()
    else
      $('#stripe_error').text(response.error.message)
      $('input[type=submit]').attr('disabled', false)

这是错误处理的例子。他们翻转过程并测试错误:

This is the example stripe gives for error handling. They flip the process and test for errors first:

function stripeResponseHandler(status, response) {
    if (response.error) {
        ...
        //show the errors on the form
        $(".payment-errors").html(response.error.message);
    } else {
        var form$ = $("#payment-form");
        // token contains id, last4, and card type
        var token = response['id'];
        // insert the token into the form so it gets submitted to the server
        form$.append("<input type='hidden' name='stripeToken' value='" + token + "'/>");
        // and submit
        form$.get(0).submit();
    }
}

更新:

我添加了一个控制台日志语句,现在可以看到 handleStripeResponse 被调用两次,一次当用户点击提交,并返回一个 200 ,然后它似乎再次(也许因为形式然后必须发布到Rails应用程序进行实际处理?并返回一个 0 ,它会踢出错误消息。但是 - 因为Rails现在正在处理服务器端,

I added a console log statement and can see now that handleStripeResponse is being called twice, once when the user hits submit, and it returns a 200, then it seems again (maybe because the form then has to be posted to the Rails app for actual processing? and it returns a 0, which kicks up the error message. BUT -- because Rails is now handling the processing server side, the charge goes through.

这是编译的JS,如果这有帮助:

Here's the compiled JS, if that helps:

(function() {
  var subscription;

  jQuery(function() {
    Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content'));
    return subscription.setupForm();
  });

  subscription = {
    setupForm: function() {
      return $('#new_membership').submit(function() {
        $('input[type=submit]').attr('disabled', true);
        if ($('#card_number').length) {
          subscription.processCard();
          return false;
        } else {
          return true;
        }
      });
    },
    processCard: function() {
      var card;
      card = {
        number: $('#card_number').val(),
        cvc: $('#card_code').val(),
        expMonth: $('#card_month').val(),
        expYear: $('#card_year').val()
      };
      return Stripe.createToken(card, subscription.handleStripeResponse);
    },
    handleStripeResponse: function(status, response) {
      if (status === 200) {
        $('#membership_stripe_card_token').val(response.id);
        return $('#new_membership')[0].submit();
      } else {
        $('#stripe_error').text(response.error.message);
        return $('input[type=submit]').attr('disabled', false);
      }
    }
  };

}).call(this);


推荐答案

,因为第二次通过回调它总是返回一个0。

So, my hacky solution thus far is to do this, since the second time through the callback it consistently returns a 0.

 else if status == 0
      $('#stripe_error').text('Processing...')

用户未收到错误消息,并且提交按钮未重新激活。

At least that way, the user doesn't get the error message and the submit button isn't reactivated.

这篇关于jQuery回调调用两次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆