You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shopify:如何在.js.liquid文件中获取产品图片的Media ID?

解决Shopify .js.liquid文件中获取产品Media ID的问题

核心原因

.js.liquid文件中,Liquid变量(如{{ media.id }})仅能在服务器端渲染阶段解析。如果是在客户端JS逻辑(比如事件回调、动态拼接HTML的代码里)直接写media.id,它会被当作普通JS变量,而非Liquid变量,自然无法获取正确值。

可行解决方向

1. 提前将Media ID注入到全局JS变量

在.js.liquid文件开头,通过Liquid把产品的media数据转成JS可直接访问的对象:

{% comment %} 注入产品media数据到全局JS变量 {% endcomment %}
<script>
  const productMedias = [
    {% for media in product.media %}
      {
        id: "{{ media.id }}",
        src: "{{ media | image_url: width: 300 }}"
      }{% unless forloop.last %},{% endunless %}
    {% endfor %}
  ];
</script>

之后在动态拼接HTML的JS代码中,从productMedias数组匹配对应项获取ID:

// 匹配当前src对应的media对象
const targetMedia = productMedias.find(media => media.src === src);
if (targetMedia) {
  thumbnailContainer.append(`<img src="${src}" alt="qv-img" class="lazyload" data-media-id="${targetMedia.id}">`);
}

2. 提前用Liquid渲染带Media ID的HTML模板

在页面中提前渲染好包含media.id的隐藏模板,之后用JS克隆/移动到目标容器:

{% comment %} 隐藏的图片模板 {% endcomment %}
<div class="media-template" style="display:none;">
  {% for media in product.media %}
    <img src="{{ media | image_url: width: 300 }}" alt="qv-img" class="lazyload" data-media-id="{{ media.id }}">
  {% endfor %}
</div>

JS中直接复用模板元素:

const templateImg = document.querySelector(`.media-template img[src="${src}"]`);
if (templateImg) {
  const newImg = templateImg.cloneNode(true);
  thumbnailContainer.appendChild(newImg);
}

3. 服务器端渲染时直接嵌入Liquid变量(仅限非动态触发场景)

如果JS代码是服务器端渲染阶段执行(而非客户端动态触发),可直接在拼接字符串中嵌入{{ media.id }},前提是当前Liquid上下文存在media变量:

{% for media in product.media %}
<script>
  const src = "{{ media | image_url: width: 300 }}";
  thumbnailContainer.append('<img src="' + src +'" alt="qv-img" class="lazyload" data-media-id="{{ media.id }}">');
</script>
{% endfor %}

该方式仅适用于不需要客户端动态触发的场景,代码是服务器端渲染完成后输出到页面的。

内容的提问来源于stack exchange,提问作者user3986510

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:05:42