id="cart-icon-bubble"を複数設置したい

Topic summary

問題の概要:
header.liquid内に同じID(id="cart-icon-bubble")を持つカートアイコンを2箇所(PC版とスマホ版)に設置したところ、挙動に問題が発生。PC版は正常に動作するが、スマホ版ではカート追加や数量変更がリアルタイムで反映されず、ページ更新時のみ更新される状態。

試した対応:

  • cart.jsなどのJavaScriptで別のIDを使用しようと試行錯誤したが失敗
  • 最悪の場合、カート内で数量変更時にエラーが発生

提案された解決策:

  1. IDをclassに変更: 同じIDを複数使用せず、classベースで動作するようコードを書き換える
  2. MutationObserverを使用: 既存要素の変化を監視し、検出時に他の要素も連動して変更させる方法

現状: 質問者はMutationObserverについて初めて知り、参考情報を得た段階。具体的な実装はまだ未解決。

Summarized with AI on November 6. AI used: claude-sonnet-4-5-20250929.

スマホやPC、またメニューのなかなどにカートアイコンを設置し、

商品が入ったらカートの中の数が更新されるようにしたく、

下記のコードを同じheader.liquid内に2箇所に設置しております。

同じID(id=“cart-icon-bubble”)なので複数設置はどうかと思っていましたが

やはり挙動が一部おかしくなってしまいます。

良い改善案はないでしょうか?

●現時点(下記コードで2箇所に設置)

先にコードを設置しているPC版は問題なく反応しますが、

下にコードがあるスマホ版は商品ページでカートインやカートで数量を変更してもリアルタイムで変更できず

ページ更新したら更新される状態。

id="cart-icon-bubble"などが記載されているJS(cart.jsなど)

うまく別のIDをしたりできないか試行錯誤しましたがうまく行かず

最悪、お買い物カート内で数量を変えたらエラーが出る状態になってしまいました。

ーーーーーーーーーーー

{%- liquid if cart == empty render 'icon-cart-empty' else render 'icon-cart' endif -%} {{ 'templates.cart.cart' | t }} {%- if cart != empty -%}
{%- if cart.item_count < 100 -%} {{ cart.item_count }} {%- endif -%} {{ 'sections.header.cart_count' | t: count: cart.item_count }}
{%- endif -%}
カート

試作確認は行なっていませんが一例としては以下のように対応することになると思います。

  • idではなくclassで動く形に書き換えて対応する
  • MutationObserverなど用いて元からある要素を監視し、変化を検出した際に連動して他の要素を変化させて対応する

参考:

https://developer.mozilla.org/ja/docs/Web/API/MutationObserver

1 Like

MutationObserverははじめて知りました。

ありがとうございます!