diff --git a/js/commerce_stripe.form.js b/js/commerce_stripe.form.js
index ada1684..8786ad5 100755
--- a/js/commerce_stripe.form.js
+++ b/js/commerce_stripe.form.js
@@ -12,13 +12,26 @@
*
* @type {Drupal~behavior}
*
+ * @prop object cardNumber
+ * Stripe card number element.
+ * @prop object cardExpiry
+ * Stripe card expiry element.
+ * @prop object cardCvc
+ * Stripe card cvc element.
* @prop {Drupal~behaviorAttach} attach
* Attaches the commerceStripeForm behavior.
+ * @prop {Drupal~behaviorDetach} detach
+ * Detaches the commerceStripeForm behavior.
*
* @see Drupal.commerceStripe
*/
Drupal.behaviors.commerceStripeForm = {
+ cardNumber: null,
+ cardExpiry: null,
+ cardCvc: null,
+
attach: function (context) {
+ var self = this;
if (!drupalSettings.commerceStripe || !drupalSettings.commerceStripe.publishableKey) {
return;
}
@@ -28,7 +41,7 @@
// Clear the token every time the payment form is loaded. We only need the token
// one time, as it is submitted to Stripe after a card is validated. If this
// form reloads it's due to an error; received tokens are stored in the checkout pane.
- $('#stripe_token', context).val('');
+ $('#stripe_token', $form).val('');
// Create a Stripe client.
/* global Stripe */
@@ -41,35 +54,35 @@
invalid: 'error'
};
// Create instances of the card elements.
- var cardNumber = elements.create('cardNumber', {
+ self.cardNumber = elements.create('cardNumber', {
classes: classes
});
- var cardExpiry = elements.create('cardExpiry', {
+ self.cardExpiry = elements.create('cardExpiry', {
classes: classes
});
- var cardCvc = elements.create('cardCvc', {
+ self.cardCvc = elements.create('cardCvc', {
classes: classes
});
// Add an instance of the card UI components into the "scard-element" element
- cardNumber.mount('#card-number-element');
- cardExpiry.mount('#expiration-element');
- cardCvc.mount('#security-code-element');
+ self.cardNumber.mount('#card-number-element');
+ self.cardExpiry.mount('#expiration-element');
+ self.cardCvc.mount('#security-code-element');
// Input validation.
- cardNumber.on('change', function (event) {
+ self.cardNumber.on('change', function (event) {
stripeErrorHandler(event);
});
- cardExpiry.on('change', function (event) {
+ self.cardExpiry.on('change', function (event) {
stripeErrorHandler(event);
});
- cardCvc.on('change', function (event) {
+ self.cardCvc.on('change', function (event) {
stripeErrorHandler(event);
});
// Insert the token ID into the form so it gets submitted to the server
var stripeTokenHandler = function (token) {
// Set the Stripe token value.
- $('#stripe_token', context).val(token.id);
+ $('#stripe_token', $form).val(token.id);
// Submit the form.
$form.get(0).submit();
@@ -95,7 +108,7 @@
// Create a Stripe token and submit the form or display an error.
var stripeCreateToken = function () {
- stripe.createToken(cardNumber).then(function (result) {
+ stripe.createToken(self.cardNumber).then(function (result) {
if (result.error) {
// Inform the user if there was an error.
stripeErrorDisplay(result.error.message);
@@ -108,7 +121,7 @@
};
// Form submit.
- $form.submit(function (e) {
+ $form.on('submit.commerce_stripe', function (e) {
// Disable the submit button to prevent repeated clicks.
$form.find('button').prop('disabled', true);
@@ -116,11 +129,22 @@
stripeCreateToken();
// Prevent the form from submitting with the default action.
- if ($('#card-number-element', context).length) {
+ if ($('#card-number-element', $form).length) {
return false;
}
});
});
+ },
+
+ detach: function (context) {
+ var self = this;
+ ['cardNumber', 'cardExpiry', 'cardCvc'].forEach(function (i) {
+ if (self[i]) {
+ self[i].unmount();
+ self[i] = null;
+ }
+ });
+ $('.stripe-form', context).closest('form').off('submit.commerce_stripe');
}
};