> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aftersell.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 从页面构建器打开抽屉

> 一个 Cart SDK 用例：让 Replo、PageFly、GemPages 以及自定义加购按钮打开 Aftersell Cart 抽屉。

Aftersell 会拦截标准 Shopify 产品表单上的加购操作。落地页构建器通常以它们自己的方式加购，使用 JavaScript 调用而不是提交表单，因此商品进入了购物车，但抽屉没有打开，或者购物者被重定向到 `/cart`。

<div id="the-fix-in-one-line">
  ## 一行代码的修复
</div>

在构建器的加购完成后，让购物车重新拉取并打开：

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
window.aftersell.cart.actions.refresh().then(() => {
  window.aftersell.cart.actions.open();
});
```

将其作为按钮上的**第二个动作**添加，放在构建器自己的"add to cart"之后，并关闭构建器的"go to cart"或"加购后跳转"选项。

<Note>
  请先尝试 [`open_on_background_add`](#the-no-code-option-first)，它往往无需改动按钮就能解决问题。
</Note>

<div id="the-no-code-option-first">
  ## 先试无代码方案
</div>

Aftersell 通过两种方式检测不是它自己处理的加购。两者始终同时运行——它们在启动时一起挂载，互不抑制，因此一次加购可能被两者同时宣告——并且每次宣告都独立应用打开规则：

* **通过网络请求。** Aftersell 监听发往 Shopify 购物车端点的请求。如果加购发生在真实点击或按键后的大约三秒内，就被视为购物者驱动，抽屉会按照你正常的 **Open cart when an item is added** 设置打开。任何通过 Shopify 的 Ajax cart API（`/cart/add.js`）加购的构建器都属于这种情况，而这是最常见的情况——所以先试试你的按钮，它可能不需要任何改动就已经可以工作。
* **[Shopify 的标准购物车事件](https://shopify.dev/docs/storefronts/themes/best-practices/standard-events)。** 以这种方式宣告的加购始终被视为*后台*加购，无论购物者是否点击过。除非你主动开启，否则后台加购不会打开抽屉：

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
window.aftersell.cart.configure({ open_on_background_add: true });
```

将其粘贴到 **Cart settings → Custom script → Initialization**。如果抽屉现在能在构建器的加购按钮之后打开，那就完成了，无需逐个按钮设置，而且覆盖所有页面。

<Note>
  `open_on_background_add` 同样涵盖完全没有购物者操作的加购——比如其他应用或脚本写入购物车。只有当你希望这些加购也弹出抽屉时才开启它。
</Note>

如果两条路径都无法打开抽屉，就退回到下面的显式调用。

<div id="per-builder-setup">
  ## 按构建器逐一设置
</div>

<div id="replo">
  ### Replo
</div>

1. 在 Replo 编辑器中打开你的页面，选中 **Add to Cart** 按钮。

2. 在右侧边栏中打开 **Interactions** 选项卡。

3. 在 **On Click** 下点击 `+`，选择 **Run JavaScript**。

4. 粘贴：

   ```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
   window.aftersell.cart.actions.refresh().then(() => {
     window.aftersell.cart.actions.open();
   });
   ```

5. 再次选中 **Add Product to Cart** 交互，关闭 **Go to cart after?**。

6. 预览，确认抽屉能打开，然后发布。

在每个带有加购按钮的页面上重复此操作。

<div id="pagefly-and-gempages">
  ### PageFly 和 GemPages
</div>

两者都允许你将自定义 JavaScript 绑定到按钮点击，或在页面上添加自定义代码元素。使用相同的代码片段，让它在构建器的加购动作之后运行，并禁用按钮上任何"跳转到购物车"的设置。

<div id="your-own-button">
  ### 你自己的按钮
</div>

如果你是自己往购物车添加商品，可以省去往返请求，直接使用 SDK 自带的 action，它能一步完成更新购物车并打开抽屉：

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
document.querySelector('#my-add-button').addEventListener('click', () => {
  window.aftersell.cart.actions.addItem(VARIANT_ID, 1).then(() => {
    window.aftersell.cart.actions.open();
  });
});
```

仅当是*其他东西*改变了购物车、你需要让 Aftersell 同步时才使用 `refresh()`：

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
fetch('/cart/add.js', { method: 'POST', /* … */ })
  .then(() => window.aftersell.cart.actions.refresh())
  .then(() => { window.aftersell.cart.actions.open(); });
```

<div id="when-the-builders-button-should-bypass-aftersell-entirely">
  ## 当构建器的按钮应完全绕过 Aftersell 时
</div>

有时情况正好相反：某个表单需要自己的流程，而 Aftersell 的拦截会造成干扰。只豁免那一个表单：

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
window.aftersell.cart.hooks.registerSkipAddToCartRule((form) =>
  form.hasAttribute('data-skip-aftersell')
);
```

然后给表单加上 `data-skip-aftersell`。这比 [`skip_add_to_cart_interceptor`](/zh/aftersell/cart/sdk-configure#skip_add_to_cart_interceptor) 更好，后者会对页面上的所有表单关闭拦截。

如果你能编辑表单的标记，还有更简单的办法：给 `<form>` 添加类名 **`aftersell-cart-skip-atc`**，Aftersell 就会跳过它，无需任何脚本。

```html theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
<form action="/cart/add" method="post" class="aftersell-cart-skip-atc">
```

<div id="troubleshooting">
  ## 故障排查
</div>

| 症状                 | 可能原因                                                                                                  |
| ------------------ | ----------------------------------------------------------------------------------------------------- |
| 商品已加入，抽屉未打开        | 构建器没有发出 Shopify 的标准购物车事件。使用显式的 `refresh()` + `open()` 调用。                                             |
| 购物者被重定向到 `/cart`   | 构建器的"加购后跳转到购物车"选项仍处于开启状态。关闭它。                                                                         |
| 抽屉打开了但显示的是旧内容      | `open()` 在 `refresh()` 完成之前就运行了。像上面那样用 `.then()` 串联它们。                                                |
| 完全没有反应             | 在购物车加载完成之前调用的 actions 会在控制台发出警告并且什么也不做。如果按钮可能在那么早就被点击，请包裹在 `window.aftersell.cart.ready().then(…)` 中。 |
| 在一个页面上有效，在另一个页面上无效 | 大多数构建器的交互是按页面设置的。在每个页面上重复设置。                                                                          |

如果某个调用看起来什么也没做，请检查 [`window.aftersellCartDebugEvents`](/zh/aftersell/cart/sdk-overview#debugging)，因为 SDK 的失败会被吞掉而不是抛出。

<div id="where-to-go-next">
  ## 后续阅读
</div>

* **[Configure](/zh/aftersell/cart/sdk-configure#open_on_background_add)**：`open_on_background_add` 及其他抽屉选项。
* **[Actions](/zh/aftersell/cart/sdk-actions)**：`refresh`、`open` 和 `addItem`。
* **[Hooks](/zh/aftersell/cart/sdk-hooks#registerskipaddtocartrule)**：豁免单个表单。
