Help! "Add to Cart" Button Not Working in My Theme

Hi everyone,

I’m having an issue with the “Add to Cart” button in my theme, and I can’t figure out what’s wrong. The button works fine in other themes, but in my current theme, nothing happens when I click it.

Here’s what I’ve tried so far:

  • Checked the code in featured-product.liquid and other relevant files.
  • Switched to another theme, where the button works as expected.

Has anyone experienced something similar or have any tips on what I should check next? I would greatly appreciate any help!

Thank you in advance!

Hi @Faxree

You seem to have a Javascript error

Uncaught SyntaxError: Unexpected token '{' (at cart-drawer.js?v=64791997275614475541739979208:84:36)

And by looking at cart-drawer.js looks like you have an extra } at

// Define CartDrawer
class CartDrawer extends HTMLElement {
  constructor() {
    super(); // Call the parent class constructor
    this.addEventListener('keyup', (evt) => evt.code === 'Escape' && this.close());
    const overlay = this.querySelector('#CartDrawer-Overlay');
    if (overlay) overlay.addEventListener('click', this.close.bind(this));

    this.setHeaderCartIconAccessibility();
  }
}

  setHeaderCartIconAccessibility() {

one before “setHeaderCartIconAccessibility()” function as that should be inside a class. As this code on GitHub shows

https://github.com/Shopify/dawn/blob/main/assets/cart-drawer.js#L10

So try to delete that } and see what is going on. As you know, you have a bit older Dawn version so the code on GitHub looks slightly different in the rest of the file.

1 Like

Hello Laza, so kind o you to help me. But I dont see the same as you when I am in cart-drawer.js

https://faxree.com/

Hi @Faxree

Yes, figured out your site :slightly_smiling_face: But now I do not see that error either.

But something is still wrong, in browser I see :

/** Shopify CDN: Minification failed

Line 9:4 Transforming const to the configured target environment ("es5") is not supported yet
Line 16:12 Expected ")" but found ":"

**/

And code is from

https://faxree.com/cdn/shop/t/3/assets/cart-drawer.js?v=62806416649478877051739997506
document.querySelectorAll('.cart-item-remove').forEach(button => {
  button.addEventListener('click', function() {
    const lineItemId = this.getAttribute('data-line-item-id');
    
    // Disable the button to prevent multiple clicks
    this.disabled = true;
    this.textContent = 'Removing...';

    fetch('/cart/change.js', 
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ id: lineItemId, quantity: 0 })
    })

Last line }) should not have }.

But this also can be a minification error that could be caused by missing } or extra { somewhere in your code. And not sure if it is in cart.js but depends. Did you make some code changes in the theme recently? A new app installed maybe?

Sorry for not being that great help.

Ahh okay, thanks for trying. This problem started earlier when I changed the code to make it possible for me to delete products from the shopping cart. But now it’s not possible to add items to the cart, which I think is even worse haha.

Well, there you go :slightly_smiling_face:

Check that code for removing products from the cart. That fetch function looks like having extra }.

You can paste the code here from your file if you want to share.

1 Like

document.querySelectorAll(‘.cart-item-remove’).forEach(button => {
button.addEventListener(‘click’, function() {
const lineItemId = this.getAttribute(‘data-line-item-id’);

// Disable the button to prevent multiple clicks
this.disabled = true;
this.textContent = ‘Removing…’;

fetch(‘/cart/change.js’,
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({ id: lineItemId, quantity: 0 })
)
.then(response => {
if (!response.ok) {
throw new Error(‘Failed to remove item’);
}
return response.json();
})
.then(() => {
location.reload(); // Reload the page to update the cart
})
.catch(error => {
console.error(‘Error:’, error);
this.disabled = false; // Re-enable the button if there’s an error
this.textContent = ‘Remove’; // Reset the button text
alert(‘Failed to remove item. Please try again.’);
});
});
});

// Ensure CartItems is defined before extending it
if (typeof window.CartItems === ‘undefined’) {
class CartItems {
constructor() {
this.items = ;
}
}
window.CartItems = CartItems; // Make it global
}
javascript
const removeButtons = document.querySelectorAll(‘.cart-item-remove’);
if (removeButtons.length > 0) {
removeButtons.forEach(button => {
button.addEventListener(‘click’, function() {
// Your existing code here
});
});
}
// Define CartDrawerItems after CartItems is guaranteed to exist
class CartDrawerItems extends window.CartItems {
constructor() {
super(); // Call the parent class constructor
console.log(“CartDrawerItems opprettet!”);
}
}

// Define CartDrawer
class CartDrawer extends HTMLElement {
constructor() {
super(); // Call the parent class constructor
this.addEventListener(‘keyup’, (evt) => evt.code === ‘Escape’ && this.close());
const overlay = this.querySelector(‘#CartDrawer-Overlay’);
if (overlay) overlay.addEventListener(‘click’, this.close.bind(this));

this.setHeaderCartIconAccessibility();
}

setHeaderCartIconAccessibility() {
const cartLink = document.querySelector(‘#cart-icon-bubble’);
if (!cartLink) return;

cartLink.setAttribute(‘role’, ‘button’);
cartLink.setAttribute(‘aria-haspopup’, ‘dialog’);

cartLink.addEventListener(‘click’, (event) => {
event.preventDefault();
this.open(cartLink);
});

cartLink.addEventListener(‘keydown’, (event) => {
if (event.code.toUpperCase() === ‘SPACE’) {
event.preventDefault();
this.open(cartLink);
}
});
}

open(triggeredBy) {
if (triggeredBy) this.setActiveElement(triggeredBy);
const cartDrawerNote = this.querySelector(‘[id^=“Details-”] summary’);

if (cartDrawerNote && !cartDrawerNote.hasAttribute(‘role’)) {
this.setSummaryAccessibility(cartDrawerNote);
}

setTimeout(() => {
this.classList.add(‘animate’, ‘active’);
});

this.addEventListener(
‘transitionend’,
() => {
const containerToTrapFocusOn = this.classList.contains(‘is-empty’)
? this.querySelector(‘.drawer__inner-empty’)
: document.getElementById(‘CartDrawer’);

const focusElement = this.querySelector(‘.drawer__inner’) || this.querySelector(‘.drawer__close’);
trapFocus(containerToTrapFocusOn, focusElement);
},
{ once: true }
);

document.body.classList.add(‘overflow-hidden’);
}

close() {
this.classList.remove(‘active’);
if (this.activeElement) removeTrapFocus(this.activeElement);
document.body.classList.remove(‘overflow-hidden’);
}

setSummaryAccessibility(cartDrawerNote) {
cartDrawerNote.setAttribute(‘role’, ‘button’);
cartDrawerNote.setAttribute(‘aria-expanded’, ‘false’);

if (cartDrawerNote.nextElementSibling?.getAttribute(‘id’)) {
cartDrawerNote.setAttribute(‘aria-controls’, cartDrawerNote.nextElementSibling.id);
}

cartDrawerNote.addEventListener(‘click’, (event) => {
event.currentTarget.setAttribute(
‘aria-expanded’,
!event.currentTarget.closest(‘details’).hasAttribute(‘open’)
);
});

cartDrawerNote.parentElement.addEventListener(‘keyup’, onKeyUpEscape);
}

renderContents(parsedState) {
const drawerInner = this.querySelector(‘.drawer__inner’);
if (drawerInner?.classList.contains(‘is-empty’)) {
drawerInner.classList.remove(‘is-empty’);
}

this.productId = parsedState.id;

this.getSectionsToRender().forEach((section) => {
const sectionElement = section.selector
? document.querySelector(section.selector)
: document.getElementById(section.id);

if (sectionElement) {
sectionElement.innerHTML = this.getSectionInnerHTML(parsedState.sections[section.id], section.selector);
}
});

setTimeout(() => {
this.querySelector(‘#CartDrawer-Overlay’)?.addEventListener(‘click’, this.close.bind(this));
this.open();
});
}

getSectionInnerHTML(html, selector = ‘.shopify-section’) {
return new DOMParser().parseFromString(html, ‘text/html’).querySelector(selector)?.innerHTML || ‘’;
}

getSectionsToRender() {
return [
{
id: ‘cart-drawer’,
selector: ‘#CartDrawer’,
},
{
id: ‘cart-icon-bubble’,
},
];
}

setActiveElement(element) {
this.activeElement = element;
}
}

customElements.define(‘cart-drawer’, CartDrawer);
customElements.define(‘cart-drawer-items’, CartDrawerItems);

Do you see where this goes badly?

Maybe here:

javascript
const removeButtons = document.querySelectorAll('.cart-item-remove');
if (removeButtons.length > 0) {
    removeButtons.forEach(button => {
        button.addEventListener('click', function() {
            // Your existing code here
        });
    });
}

You have “javascript” there.

1 Like

There, I had hope for a second :slightly_smiling_face: Unfortunately, that wasn’t the cause either:(

Last try :slightly_smiling_face:

I had to copy it to VS code editor, but looks like it is in the fetch function. Options should be an object so :

fetch('/cart/change.js',{
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    id: lineItemId,
                    quantity: 0
                })
            })

Hope that is it.

1 Like

It works but now its laggy, and I cant remove items fro cart. Really strange!! Ai just makes it worse also.. HAHA

1 Like

Well, at least some progress :slightly_smiling_face: Have fun.

1 Like