我在Shopify上使用了“ Loft”主题。当我在产品页面上选择一个变体时,他们会将SKU和价格更新为该变体,因此我需要更多功能,因为我想使用元字段显示每个变体的尺寸。
我已经创建了一个函数,并在变体选择中调用了它,如下所示:
jQuery(function($) {
new Shopify.OptionSelectors('productSelect', {
product: {{ product | json }},
onVariantSelected: selectCallback,
enableHistoryState: true
});
});
将调用我的函数,并且我可以执行所需的操作。但这阻止了默认操作的发生,例如更新价格和SKU。我可以同时打电话给他们吗?
答案 0 :(得分:1)
有很多方法可以使这项工作。
首先,您需要了解主题在本地如何处理变体。对于放样,它使用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');
});
});
答案 1 :(得分:0)
适合您的食谱如下。当原始的Liquid渲染时(发生一次),您将产品作为json保存到某个Javascript变量中。您还有一个额外的任务,即遍历变量,并为每个变量分配其元字段。为了使您的生活更轻松,您可以选择在产品级别将变量尺寸保存为JSON_STRING元字段,其中变量ID是键,尺寸是值。
尽管如此,您仍保存了键入变量ID的尺寸。现在,当发生选择器更改事件时,您将在现有选项选择器回调中将变量传递到一个盘子上。给自己编写一个函数,该函数使用提供的变量ID从已保存的对象中获取尺寸。使用这些值,更新DOM即可完成。