商家向 SDK 索求的很多功能已经是设置项。编写脚本之前,请先检查购物车区块、按市场/国家/货币的条件或购物车设置是否已经能做到。这些在购物车重新设计后仍能继续工作,而你的脚本可能不行。
全局入口点
本文档中的每个代码片段都完整写出
window.aftersell.cart,所以任何一个片段粘贴后都能独立工作。先起一次别名(const cart = window.aftersell.cart;)然后一直用 cart 也完全有效,即使在购物车加载之前也是安全的。只是缩短片段时记得带上那一行,因为单独的 cart 会抛出 cart is not defined。配置
设定购物车的行为方式:抽屉何时打开、金额如何格式化、Aftersell 是否拦截加入购物车。
事件
响应发生的事情:购物车已加载、添加了商品、抽屉打开了、点击了结账。
操作
读取和更改购物车:打开它、添加商品、更新数量、读取当前状态。
Hooks
改变购物车本身的工作方式:隐藏或重新标记行、重新排序、附加额外数据、控制加入购物车。
如果你的某个脚本在加入购物车时不再触发,请从加入购物车拦截开始了解。它解释了 Aftersell 为什么接管添加,以及为表单退出的所有方式。
事件、操作还是 hooks?
最重要的区别在于:操作更改购物者的实际购物车(以及其总额),而 hook 只更改渲染的内容。用 hook 隐藏一行,它仍留在购物车中并计入总额;用操作移除它才是真正拿出来。
加载方式与时机
- 一个小的桩会立即创建
window.aftersell.cart,所以它始终存在。 - 完整的 SDK 随后很快加载并接管,原地升级这个桩,所以你之前捕获的引用会继续有效。
设置类调用:立即可用
configure(...)、events.on(...) 以及每个 hooks.register* 调用。在启动前被缓冲,并在 SDK 加载后按顺序重放。把它们放在脚本顶部。操作:等待 ready()
actions.* 下的一切。在 ready() 或事件处理函数内部运行它们。调用过早时它们会在控制台发出警告并安全地什么都不做:异步操作仍会 resolve,所以 .then() 链不会断。ready()
ready() 返回一个 Promise,在首次购物车加载落定时 resolve。失败和成功时它都会 resolve,所以网络不稳定的购物者永远不会让你的脚本悬挂。请检查 getCart() 是否为 null,而不要假设购物车一定到达了。
在购物车已加载后调用 ready() 会立即 resolve,所以可以在代码的任何地方安全地把它当作通用的”购物车现在存在了”闸门。
context
window.aftersell.cart.context 持有服务器渲染的买家数据,可同步读取,无需 ready()。用它来进行必须在购物车加载之前完成的市场或国家分支判断。
要按市场、国家或货币显示不同的区块设置,请改用购物车编辑器中的条件。无需脚本。完整的 Conditions UI 目前已在 Rewards 上提供。
shadowRoot
document.querySelector 看不到抽屉内的任何东西。要访问购物车中的元素,请查询 shadow root:
cart-external-* 类。那些是受支持的把手。cart-internal-* 孪生类是购物车自身的内部机制,所以请查询外部类。
Shadow root 只有在购物车启动后才存在,所以请在 ready() 或事件处理函数内部读取它,而不要在脚本顶部读取。
调试
脚本抛出错误时
configure、events.on 和 hooks.register* 都不会运行。购物车会明确指出:
aftersell-cart-init.js 和 aftersell-cart-cart-update.js。你可以像其他任何文件一样从 Sources 面板打开它们并设置断点。
调试通道
后续阅读
配置
每个选项,各配一个示例。
事件
每个事件、触发时机,以及在处理函数中不该做什么。
操作
每个操作,各配一个代码片段。
Hooks
每个 hook,以及注册如何组合。
购物车对象
购物车及其行的结构。
使用案例
常见需求的完整可运行解决方案。