Javascript TypeError: variable is undefined

Javascript TypeError: variable is undefined

目前我正在 Rails 应用程序上开发 Ruby,我正在尝试让以下 JS 与该应用程序一起使用。我遇到的第一个问题是 turbolinks 5.0 阻止页面在初始加载时加载 JS,我必须刷新页面才能加载下面的 JS。我做了一些谷歌搜索,遇到了 this Whosebug answer,但我似乎无法在不抛出错误的情况下正确地将 JS 设置为 运行。任何帮助将不胜感激。

orders.js

console.log('inside orders.js');

$(document).on('turbolinks:load', function() {
// Your JS here
var payment;

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

payment = {
  setupForm: function() {
    return $('#new_order').submit(function() {
      $('input[type=submit]').attr('disabled', true);
      Stripe.card.createToken($('#new_order'), payment.handleStripeResponse);
      return false;
    });
  },
  handleStripeResponse: function(status, response) {
    if (status === 200) {

      // return alert(response.id);
      $('#new_order').append($('<input type="hidden" name="stripeToken" />').val(response.id));
      return $('#new_order')[0].submit();

    } else {

      // return alert(response.error.message);
      return $('#stripe_error').text(response.error.message).show();

    }
  }
};
});

如上评论所述,问题与jQuery语句在JS中的位置有关。我将 JS 重组为如下所示,现在一切正常。

orders.js

console.log('inside orders.js');

$(document).on('turbolinks:load', function() {
// Your JS here
var payment;

payment = {
  setupForm: function() {
    return $('#new_order').submit(function() {
      $('input[type=submit]').attr('disabled', true);
      Stripe.card.createToken($('#new_order'), payment.handleStripeResponse);
      return false;
    });
  },

  handleStripeResponse: function(status, response) {
    if (status === 200) {

      // return alert(response.id);
      $('#new_order').append($('<input type="hidden" name="stripeToken" />').val(response.id));
      return $('#new_order')[0].submit();

    } else {

      // return alert(response.error.message);
      return $('#stripe_error').text(response.error.message).show();

    }
  }
};

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