Simple Theme - Select Variant By Clicking Variant Image

I posted the code below (w/the notes) to the very bottom of theme.js.liquid but it did not work. It just made all my product images tinted white and unclickable. Can anyone see where it went wrong?

//code for making sure when clicking on an image the correct variant is selected
//Variant By Clicking Their Image - 2022 Free Shopify Tutorial - Andrew from EcomExperts
//https://ecomexperts.io/blogs/liquid-tutorial-shopify/select-variants-by-clicking-their-images-shopify-tutorial

const selectVariantByClickingImage = {

// Create variant images from productJson object

_createVariantImage: function (product) {

const variantImageObject = {};

product.variants.forEach((variant) => {

if (

typeof variant.featured_image !== ‘undefined’ &&

variant.featured_image !== null

) {

const variantImage = variant.featured_image.src

.split(‘?’)[0]

.replace(/http(s)?:/, ‘’);

variantImageObject[variantImage] =

variantImageObject[variantImage] || {};

product.options.forEach((option, index) => {

const optionValue = variant.options[index];

const optionKey = option-${index};

if (

typeof variantImageObject[variantImage][optionKey] === ‘undefined’

) {

variantImageObject[variantImage][optionKey] = optionValue;

} else {

const oldValue = variantImageObject[variantImage][optionKey];

if (oldValue !== null && oldValue !== optionValue) {

variantImageObject[variantImage][optionKey] = null;

}

}

});

}

},

_updateVariant: function (event, id, product, variantImages) {

const arrImage = event.target.src

.split(‘?’)[0]

.replace(/http(s)?:/, ‘’)

.split(‘.’);

const strExtention = arrImage.pop();

const strRemaining = arrImage.pop().replace(/_[a-zA-Z0-9@]+$/, ‘’);

const strNewImage = ${arrImage.join('.')}.${strRemaining}.${strExtention};

if (typeof variantImages[strNewImage] !== ‘undefined’) {

product.variants.forEach((option, index) => {

const optionValue = variantImages[strNewImage][option-${index}];

if (optionValue !== null && optionValue !== undefined) {

const selects = document.querySelectorAll(‘#’+ id + ’ [class*=single-option-selector]');

const options = selects[index].options;

for (let option, n = 0; (option = options[n]); n += 1) {

if (option.value === optionValue) {

selects[index].selectedIndex = n;

selects[index].dispatchEvent(new Event(‘change’));

break;

}

}

}

});

}

},

_selectVariant: function() {

const productJson = document.querySelectorAll(‘[id^=ProductJson-’);

if (productJson.length > 0) {

productJson.forEach((product) => {

const sectionId = product.id.replace(“ProductJson-”, “shopify-section-”);

const thumbnails = document.querySelectorAll(‘#’+ sectionId + ’ img[src*=“/products/”]');

if (thumbnails.length > 1) {

const productObject = JSON.parse(product.innerHTML);

const variantImages = this._createVariantImage(productObject);

// need to check variants > 1

if (productObject.variants.length > 1) {

thumbnails.forEach((thumbnail) => {

thumbnail.addEventListener(‘click’, (e) =>

this._updateVariant(e, sectionId, productObject, variantImages),

);

});

}

}

});

}

},

};

if (document.readyState !== ‘loading’) {

selectVariantByClickingImage._selectVariant();

} else {

document.addEventListener(

‘DOMContentLoaded’,

selectVariantByClickingImage._selectVariant(),

);

}

1 Like

@patrickanthony
This solution will not work in the themes Boundless, Express, or Narrative and Dawn or new theme. If you use the Brooklyn theme, the solution will work, but you will need to set the picker type to dropdown on your product page.

@patrickanthony

Try to add the cdn js file

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

@Kinjaldavra any suggestions for issue above?

@tim_1 any suggestions on issue above?

@Nick_Marketing do you have a video on the issue above?