Is there a way to avoid calling the document with jQuery on click?
I'm not sure this question really fits into the site but I'm going to answer it anyway.  


Since the elements don't exist when the page is loaded you can't add a click event to it (yet).  If you try to attach the event handler directly to the elements at this time it won't do anything since the elements don't exist.  So instead you attach the click element to the document element (which does exist) and then when the click handler is fired (with a click anywhere on the document) it looks to see if the click event was done on an object that matched the selector you entered at that point.  If it was then the click handler is fired.

That was confusing even to me.  Let me try a different way.

Option 1

Attempt to attach the event handler to the actual element on page load using the selector.

$('.class-name').on('click', function(){})


The element does not exist yet so this does nothing.

Option 2

Attach the event handler to a static element and provide a delegated selector to test for when the item is clicked.

$(document).on('click','.class-name', function(){})


This event handler is successfully added to the document object.  Now when any click happens within the document, the selector is tested and if a match the function is fired.  
No, but you need to use a static element.  I used the document but it could be any static element as long as all dynamic elements will be contained within.  In your case it might be something like $('.header-shopping-cart-items').on('click', '.item a', function() {}) provided the .header-shopping-cart-items container were static (always there).

Another option, although much more difficult and probably not worth the effort would be to attach the event handler directly to the item row when you inject it.  I wouldn't recommend that approach.
You could look into putting this into a module and calling that module when needed.  But I don't know that you would be gaining anything by putting this into a IIFE.   And I wouldn't say that IIFEs are preferred over the jQuery.ready function.  That said, this whole code could probably be put into a IIFE without any changes.  You would just need to put it at the bottom of the document.