FROM CACHE - jp_header
このコミュニティはピアツーピアサポートに移行しました。Shopify サポートは今後、このコミュニティへのサービスを提供いたしません。これからもぜひ、他のマーチャントやパートナーとつながり、サポートし合い、経験を共有してください。 当社の行動規範に違反する行動や削除を希望するコンテンツがありましたら、引き続きご報告ください

カートに追加ボタンが動かない

解決済

カートに追加ボタンが動かない

izawa
Shopify Partner
6 1 0

写真のページを構築中です。カートに追加するというボタンが動かないのですが、動かすにはどうすればよいでしょうか?

スクリーンショット 2021-10-18 19.26.32.png

また、検証ツールで見ると以下の様になるのですが、action="/cart/add"は、どこにあるのでしょうか?cart.jsでしょうか?

 

<form method="post" action="/cart/add" id="product-form-template--15129399951519__main" accept-charset="UTF-8" class="form" enctype="multipart/form-data" novalidate="novalidate" data-type="add-to-cart-form">
<input type="hidden" name="form_type" value="product">
<input type="hidden" name="utf8" value="✓">
<input type="hidden" name="id" value="41187198042271">
   <div class="product-form__buttons">
      <button type="submit" name="add" class="product-form__submit button button--full-width button--   
        primary">カートに追加する</button>
   </div>
</form>

 

 

実際に記述しているコードは以下です。

 

{%- form 'product', product, id: product_form_id, class: 'form', novalidate: 'novalidate', data-type: 'add-to-cart-form' -%}
                  <input type="hidden" name="id" value="{{ product.selected_or_first_available_variant.id }}">
                  <div class="product-form__buttons">
                    <button
                      type="submit"
                      name="add"
                      class="product-form__submit button button--full-width {% if block.settings.show_dynamic_checkout and product.selling_plan_groups == empty %}button--secondary{% else %}button--primary{% endif %}"
                    {% if product.selected_or_first_available_variant.available == false %}disabled{% endif %}
                    >
                        {%- if product.selected_or_first_available_variant.available -%}
                          {{ 'products.product.add_to_cart' | t }}
                        {%- else -%}
                          {{ 'products.product.sold_out' | t }}
                        {%- endif -%}
                    </button>
                    {%- if block.settings.show_dynamic_checkout -%}
                      {{ form | payment_button }}
                    {%- endif -%}
                  </div>
                {%- endform -%}

 

 

1 件の受理された解決策
izawa
Shopify Partner
6 1 0

成功

teratailで質問したら、教えていただけました。
https://teratail.com/questions/365988#

原因は、setActiveを定義しているcartNotification.jsのファイルの読み込む順でした。
cartNotification.jsを読み込んでからproduct-form.jsを読み込ませないといけないようです。

元の投稿で解決策を見る

4件の返信4

izawa
Shopify Partner
6 1 0

product-form.jsファイルの.onSubmitHandler(evt)にあるthis.cartNotification.setActiveElement(document.activeElement);という記述がエラーの原因でした。

これはnullのプロパティを読み取ることができないみたいです。

ここからどこをどう変更すればいいかはまだ分かりません。

ちなみに、これはDawnテーマを元にしています。

 

 

if (!customElements.get('product-form')) {
  customElements.define('product-form', class ProductForm extends HTMLElement {
    constructor() {
      super();

      this.form = this.querySelector('form');
      this.form.addEventListener('submit', this.onSubmitHandler.bind(this));
      this.cartNotification = document.querySelector('cart-notification');
    }

    onSubmitHandler(evt) {
      evt.preventDefault();
      const submitButton = this.querySelector('[type="submit"]');
      if (submitButton.classList.contains('loading')) return; 

      this.handleErrorMessage();
      this.cartNotification.setActiveElement(document.activeElement);

      submitButton.setAttribute('aria-disabled', true);
      submitButton.classList.add('loading');

      const config = fetchConfig('javascript');
      config.headers['X-Requested-With'] = 'XMLHttpRequest';
      config.body = JSON.stringify({
        ...JSON.parse(serializeForm(this.form)),
        sections: this.cartNotification.getSectionsToRender().map((section) => section.id),
        sections_url: window.location.pathname
      });

      fetch(`${routes.cart_add_url}`, config)
        .then((response) => response.json())
        .then((response) => {
          if (response.status) {
            this.handleErrorMessage(response.description);
            return;
          }

          this.cartNotification.renderContents(response);
        })
        .catch((e) => {
          console.error(e);
        })
        .finally(() => {
          submitButton.classList.remove('loading');
          submitButton.removeAttribute('aria-disabled');
        });
    }

    handleErrorMessage(errorMessage = false) {
      this.errorMessageWrapper = this.errorMessageWrapper || this.querySelector('.product-form__error-message-wrapper');
      this.errorMessage = this.errorMessage || this.errorMessageWrapper.querySelector('.product-form__error-message');

      this.errorMessageWrapper.toggleAttribute('hidden', !errorMessage);

      if (errorMessage) {
        this.errorMessage.textContent = errorMessage;
      }
    }
  });
}

 

 

izawa
Shopify Partner
6 1 0
this.cartNotification.setActiveElement(document.activeElement);

この行の this.cartNotification が null なので、setActiveElement というプロパティが読めない。

this.cartNotification = document.querySelector('cart-notification');

ここで document.querySelector() が null を返していた。

()内の記述が間違っているのか、と思って色々調べて試してみましたが問題なかったようでした...。
()内が反応していないことは確かなので、とりあえずこのproduct-form.jsを読み込ませるのをやめたらボタンは機能しました。
なぜnullが返ってくるのかは未だに分からないが、とりあえずの応急処置で読み込ませるのをやめました。

izawa
Shopify Partner
6 1 0

成功

teratailで質問したら、教えていただけました。
https://teratail.com/questions/365988#

原因は、setActiveを定義しているcartNotification.jsのファイルの読み込む順でした。
cartNotification.jsを読み込んでからproduct-form.jsを読み込ませないといけないようです。

mongorian346
Shopify Partner
24 0 1

すいません。このCDNの読み込みの順番を変更するのはどうやるのでしょうか?