与主题编辑器集成分区

当用户通过主题编辑器自定义分区时,这些分区的 HTML 将直接在现有 DOM 上动态添加、移除或重新渲染,而无需重新加载整个页面。不过,页面加载时运行的任何相关 JavaScript 都不会再次运行。

此外,您必须确保在选择某个分区或块时,该分区或块在被选中时是可见的,并保持可见。例如,幻灯片部分应在选中该部分时滚动显示,滑动到选中的区块(幻灯片),并在选中该区块时暂停。

为了帮助识别主题编辑器的操作(如选择或重新排序部分和区块),可以使用主题编辑器的 JavaScript 事件。

您可能还想阻止特定代码在主题编辑器中运行。为此,可以使用 Liquid 和 JavaScript 变量来检测主题编辑器。

提示
分区文件必须在其schema中定义预设,以支持使用主题编辑器添加到 JSON 模板中。没有预设的分区文件应手动包含在 JSON 文件中,而且不能使用主题编辑器删除。

JavaScript 事件

为了识别分区和区块,主题编辑器会在相关分区或区块的父元素上查找特定的数据属性。分区由 Shopify 生成的元素包裹,默认情况下包含该属性。不过,区块需要使用区块对象的 shopify_attributes 属性手动添加属性。

主题编辑器会发出冒泡的分区和块 JavaScript 事件,这些事件不可取消。每个事件都有一个目标(event.target),根据上述数据属性,目标可以是相关的分区或块元素。

除分区和块事件外,主题编辑器还会在主题编辑器预览检查器激活或停用时发出事件。

下表概述了主题编辑器发出的事件:

类型目标详细触发
shopify:inspector:activate主题编辑器预览检查器已激活
shopify:inspector:deactivate主题编辑器预览检查器停用
shopify:section:loadsection{sectionId}添加或重新渲染了一个分区
shopify:section:unloadsection{sectionId}某分区已删除或正在重新渲染
shopify:section:selectsection{
sectionId,
load
}
用户选择了侧边栏中的分区
shopify:section:deselectsection{sectionId}用户已取消选择侧边栏中的分区
shopify:section:reordersection{sectionId}一个分区已重新排序
shopify:block:selectblock{
blockId,
sectionId,
load
}
用户选择了侧边栏中的块
shopify:block:deselectblock{
blockId,
sectionId
}
用户已取消选择侧边栏中的块

在上表中,blockId 代表块 ID,sectionId 代表分区 ID,而 load 则表示事件是由区块重新渲染触发的,还是由用户选择触发的。load的值为 true 或 false。

提示
有关如何使用主题编辑器 JavaScript 事件的示例,请参阅 Dawn 中的 theme-editor.js asset。

检测主题编辑器

您可以在 Liquid 和 JavaScript 中检测是否处于主题编辑器中。

Liquid

Liquid 请求对象有一个 Shopify.design_mode 属性,如果您在主题编辑器中,该属性将返回 true;如果不在主题编辑器中,则返回 false。例如

{% if request.design_mode %}
  <!-- This will only render in the theme editor -->
{% endif %}

检测主题编辑器预览检查器

除了激活或停用主题编辑器预览检查器时触发的 JavaScript 事件外,您还可以使用全局变量 Shopify.inspectMode。如果预览检查器已激活,它将返回 true;如果未激活,则返回 false。例如

if (Shopify.inspectMode) {
  // This will only execute if the theme editor preview inspector is currently activated
}

检测主题编辑器可视化预览

您可以在 Liquid 和 JavaScript 中检测是否处于主题编辑器可视化预览中。

Liquid

Liquid 请求对象有一个 visual_preview_mode 属性,如果处于主题编辑器可视化预览状态,则返回 true,否则返回 false。例如

{% if request.visual_preview_mode %}
    <!-- This will only render in the theme editor visual preview -->
{% endif %}

JavaScript

如果您在主题编辑器的可视化预览中,全局变量 Shopify.visualPreviewMode 将返回 true,否则返回undefined
例如

if (Shopify.visualPreviewMode) {
  // This will only execute inside the theme editor's visual preview
}

原文链接https://shopify.dev/docs/themes/architecture/sections/integrate-sections-with-the-theme-editor

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注