有多种方法可以实现这一目标。
首先,您需要了解您的主题是如何原生处理变体的。对于 loft 它使用 theme.Variant 对象,因此自定义变体选择很简单:
jQuery('#shopify-section-product-template').on('theme:variants:changed', function(evt, variantObj){
console.log('theme event for '+ variantObj.sku); // limited view of variant.
console.log(variantObj);
});
对于使用旧版 Shopify.OptionSelectors 的主题,您可以通过覆盖 selectCallback 全局函数来实现这一点:
(function(){
var original_selectCallback = window.selectCallback;
window.selectCallback = function(variant, selector) {
original_selectCallback(variant, selector); // call the original function
myCustomHandler(variant); // called with the full jsonified variant object.
};
})();
最后,我处理过的大多数现代主题以及使用 Shopify.OptionSelectors 和 enableHistoryState: true 的主题允许您跳过覆盖的混乱并安装您自己的历史处理程序。这是您需要自己的脚本/液体组装获取变体和产品属性所需的 JSON 的地方:
document.addEventListener('DOMContentLoaded', function(){
function usePushState(handler){
//modern themes use pushstate to track variant changes without reload
function track (fn, handler, before) {
return function interceptor () {
if (before) {
handler.apply(this, arguments);
return fn.apply(this, arguments);
} else {
var result = fn.apply(this, arguments);
handler.apply(this, arguments);
return result;
}
};
}
var currentVariantId = null;
function variantHandler () {
var selectedVariantId = window.location.search.replace(/.*variant=(\d+).*/, '$1');
console.log('checking variant change to '+ selectedVariantId);
if(!selectedVariantId) return;
if(selectedVariantId != currentVariantId){
currentVariantId = selectedVariantId;
handler(selectedVariantId);
}
}
// Assign listeners
window.history.pushState = track(history.pushState, variantHandler);
window.history.replaceState = track(history.replaceState, variantHandler);
window.addEventListener('popstate', variantHandler);
}
usePushState(function(variantId){
console.log('variant: '+ variantId +' selected');
});
});