🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime
🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime
🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime
🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime
🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime
🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime
🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime
🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime
🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime
🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime
🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime
🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime
🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime
🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime

🔥HOT SALE🔥Halloween Glass Suncatcher Wind Chime

$29.99 $0.00
Save $-29.99
const TAG = "spz-custom-product-automatic"; class SpzCustomProductAutomatic extends SPZ.BaseElement { constructor(element) { super(element); this.variant_id = 'fb650a42-af9d-4665-abbb-afc7fc9c261a'; this.isRTL = SPZ.win.document.dir === 'rtl'; this.isAddingToCart_ = false; // 加购中状态 } static deferredMount() { return false; } buildCallback() { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.setupAction_(); this.viewport_ = this.getViewport(); } mountCallback() { this.init(); // 监听事件 this.bindEvent_(); } async init() { this.handleFitTheme(); const data = await this.getDiscountList(); this.renderApiData_(data); } async getDiscountList() { const productId = '639405b7-406d-40d7-9af0-f350270a774f'; const variantId = this.variant_id; const productType = 'default'; const reqBody = { product_id: productId, variant_id: variantId, discount_method: "DM_AUTOMATIC", customer: { customer_id: window.C_SETTINGS.customer.customer_id, email: window.C_SETTINGS.customer.customer_email }, product_type: productType } const url = `/api/storefront/promotion/display_setting/text/list`; const data = await this.xhr_.fetchJson(url, { method: "post", body: reqBody }).then(res => { return res; }).catch(err => { this.setContainerDisabled(false); }) return data; } async renderDiscountList() { this.setContainerDisabled(true); const data = await this.getDiscountList(); this.setContainerDisabled(false); // 重新渲染 抖动问题处理 this.renderApiData_(data); } clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } async renderApiData_(data) { const parentDiv = document.querySelector('.automatic_discount_container'); const newTplDom = await this.getRenderTemplate(data); if (parentDiv) { parentDiv.innerHTML = ''; parentDiv.appendChild(newTplDom); } else { console.log('automatic_discount_container is null'); } } doRender_(data) { const renderData = data || {}; return this.templates_ .findAndRenderTemplate(this.element, renderData) .then((el) => { this.clearDom(); this.element.appendChild(el); }); } async getRenderTemplate(data) { const renderData = data || {}; return this.templates_ .findAndRenderTemplate(this.element, { ...renderData, isRTL: this.isRTL }) .then((el) => { this.clearDom(); return el; }); } setContainerDisabled(isDisable) { const automaticDiscountEl = document.querySelector('.automatic_discount_container_outer'); if(isDisable) { automaticDiscountEl.setAttribute('disabled', ''); } else { automaticDiscountEl.removeAttribute('disabled'); } } // 绑定事件 bindEvent_() { window.addEventListener('click', (e) => { let containerNodes = document.querySelectorAll(".automatic-container .panel"); let bool; Array.from(containerNodes).forEach((node) => { if(node.contains(e.target)){ bool = true; } }) // 是否popover面板点击范围 if (bool) { return; } if(e.target.classList.contains('drowdown-icon') || e.target.parentNode.classList.contains('drowdown-icon')){ return; } const nodes = document.querySelectorAll('.automatic-container'); Array.from(nodes).forEach((node) => { node.classList.remove('open-dropdown'); }) // 兼容主题 this.toggleProductSticky(true); }) // 监听变体变化 document.addEventListener('dj.variantChange', async(event) => { // 重新渲染 const variant = event.detail.selected; if (variant.product_id == '639405b7-406d-40d7-9af0-f350270a774f' && variant.id != this.variant_id) { this.variant_id = variant.id; this.renderDiscountList(); } }); } // 兼容主题 handleFitTheme() { // top 属性影响抖动 let productInfoEl = null; if (window.SHOPLAZZA.theme.merchant_theme_name === 'Wind' || window.SHOPLAZZA.theme.merchant_theme_name === 'Flash') { productInfoEl = document.querySelector('.product-info-body .product-sticky-container'); } else if (window.SHOPLAZZA.theme.merchant_theme_name === 'Hero') { productInfoEl = document.querySelector('.product__info-wrapper .properties-content'); } if(productInfoEl){ productInfoEl.classList.add('force-top-auto'); } } // 兼容 wind/flash /hero 主题 (sticky属性影响 popover 层级展示, 会被其他元素覆盖) toggleProductSticky(isSticky) { let productInfoEl = null; if (window.SHOPLAZZA.theme.merchant_theme_name === 'Wind' || window.SHOPLAZZA.theme.merchant_theme_name === 'Flash') { productInfoEl = document.querySelector('.product-info-body .product-sticky-container'); } else if (window.SHOPLAZZA.theme.merchant_theme_name === 'Hero') { productInfoEl = document.querySelector('.product__info-wrapper .properties-content'); } if(productInfoEl){ if(isSticky) { // 还原该主题原有的sticky属性值 productInfoEl.classList.remove('force-position-static'); return; } productInfoEl.classList.toggle('force-position-static'); } } setupAction_() { this.registerAction('handleDropdown', (invocation) => { const discount_id = invocation.args.discount_id; const nodes = document.querySelectorAll('.automatic-container'); Array.from(nodes).forEach((node) => { if(node.getAttribute('id') != `automatic-${discount_id}`) { node.classList.remove('open-dropdown'); } }) const $discount_item = document.querySelector(`#automatic-${discount_id}`); $discount_item && $discount_item.classList.toggle('open-dropdown'); // 兼容主题 this.toggleProductSticky(); }); // 加购事件 this.registerAction('handleAddToCart', (invocation) => { // 阻止事件冒泡 const event = invocation.event; if (event) { event.stopPropagation(); event.preventDefault(); } // 如果正在加购中,直接返回 if (this.isAddingToCart_) { return; } const quantity = invocation.args.quantity || 1; this.addToCart(quantity); }); } // 加购方法 async addToCart(quantity) { // 设置加购中状态 this.isAddingToCart_ = true; const productId = '639405b7-406d-40d7-9af0-f350270a774f'; const variantId = this.variant_id; const url = '/api/cart'; const reqBody = { product_id: productId, variant_id: variantId, quantity: quantity }; try { const data = await this.xhr_.fetchJson(url, { method: 'POST', body: reqBody }); // 触发加购成功提示 this.triggerAddToCartToast_(); return data; } catch (error) { error.then(err=>{ this.showToast_(err?.message || err?.errors?.[0] || 'Unknown error'); }) } finally { // 无论成功失败,都重置加购状态 this.isAddingToCart_ = false; } } showToast_(message) { const toastEl = document.querySelector("#apps-match-drawer-add_to_cart_toast"); if (toastEl) { SPZ.whenApiDefined(toastEl).then((apis) => { apis.showToast(message); }); } } // 触发加购成功提示 triggerAddToCartToast_() { // 如果主题有自己的加购提示,则不显示 const themeAddToCartToastEl = document.querySelector('#add-cart-event-proxy'); if (themeAddToCartToastEl) return; // 显示应用的加购成功提示 this.showToast_("Added successfully"); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SpzCustomProductAutomatic);
class SpzCustomDiscountBundle extends SPZ.BaseElement { constructor(element) { super(element); } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } mountCallback() { // 同一页可能有多个 block 各自渲染本 snippet,导致逻辑元素 spz-custom-discount-toast(#appsAddCartToastFunc) 重复。 // 仅保留 DOM 中第一个实例,其余重复实例移除自身,保证逻辑元素及其 action 引用(appsAddCartToastFunc)唯一。 const funcs = document.querySelectorAll('#appsAddCartToastFunc'); if (funcs.length > 1 && this.element !== funcs[0]) { this.element.remove(); return; } // 全局折扣 toast 的弹出点分散在多个模板/组件里(含声明式 @atcError),无法逐一在弹出前前置, // 故挂载时幂等地去重并挂到 body;加购 toast 改为弹出前按需去重(见 showAddToCartToast) this.ensureSingleToastInBody_('cart_match_discount_toast_wrap'); } unmountCallback() {} // 同一页面可能有多个 block 各自渲染本 toast snippet(如商详的 discount_automatic + 购物车抽屉里的折扣横幅), // 导致 toast 外层出现重复 id。重复 id 下 getElementById/querySelector 及 SPZ 动作引用都只命中第一个, // 且被关进抽屉的那份会被抽屉的 transform/overflow 裁剪/错位。这里在挂载时幂等去重: // 只保留一份、移除多余的,并把保留的挂到 body(body 是 position:fixed 最安全的落点,避免被任何祖先裁剪)。可反复调用。 ensureSingleToastInBody_(id) { const els = Array.from(document.querySelectorAll('#' + id)); if (!els.length) return; els.slice(1).forEach((el) => el.remove()); const keep = els[0]; if (keep.parentNode !== document.body) { document.body.appendChild(keep); } } // 主题购物车抽屉是否打开 isInCartDrawer_() { return !!document.querySelector('[data-section-type="cart_drawer"] spz-sidebar[open]'); } setupAction_() { this.registerAction('showAddToCartToast', () => { // 抽屉内加购:主题本就不会有加购效果,统一弹插件自己的 toast // 非抽屉:主题有加购代理则沿用主题加购效果,否则插件兜底 const proxyEl = document.getElementById('add-cart-event-proxy'); const inDrawer = this.isInCartDrawer_(); if (!inDrawer && proxyEl) { return; } // 弹出前按需去重并挂到 body(幂等),避免重复 id 命中错对象或被抽屉裁剪/错位 this.ensureSingleToastInBody_('apps_add_cart_toast_wrap'); const toastEl = document.querySelector('#apps-match-drawer-add_to_cart_toast') SPZ.whenApiDefined(toastEl).then((apis) => { apis.showToast("Added successfully"); }); }); } buildCallback() { this.setupAction_(); }; } SPZ.defineElement('spz-custom-discount-toast', SpzCustomDiscountBundle);

style

Please select a style

Quantity

Apple Pay Google Pay Visa Mastercard PayPal American Express Discover
Free shipping on orders over $59
Secure checkout with trusted payment options
30-day returns if needed

❤️TIPS: All goods are authentic, with genuine patents, counterfeit must be investigated! Customers, please identify our products!

SHIPPING WORLDWIDE. 
💯Payments Via PayPal® and CreditCard.

🎁Don't forget to buy some for your family or friends as it's a unique gift idea.❤️❤️❤️

🎃 Features of 7 Individual Designs
  1. 🧙‍♀️ Witch Hat Style: Gradient purple-black stained glass witch hat, decorated with pumpkins, purple flowers, moons & bats, full of mysterious retro witch vibe
  2. 🐦‍⬛ Hummingbird & Black Cat Style: Colorful iridescent hummingbird paired with pumpkin flowers, matched with black cat, cute ghosts & jack-o-lanterns, sweet dark forest Halloween style
  3. 👻 Cute Ghost Style: Large pearlescent white ghost as main pattern, decorated with mini ghosts, crescent moons & stars, soft and lovely healing aesthetic
  4. 💀 Sugar Skull Style: Mexican Day of the Dead floral skull, covered with pink-orange glass flowers & hearts, gorgeous girly gothic design
  5. 🦇 Giant Bat Style: 3D gradient purple-black bat as core element, surrounded by pumpkins, stars & moons, cool dark Halloween decor
  6. 🐈 Black Cat on Moon Style: Glossy golden crescent with stained glass black cat, decorated with tiny cats, bats & pumpkins, quiet romantic night vibe
  7. 🕷️ Spider Web Style: Purple-edged crescent spider web with colorful central spider, matched with mini spiders, bats & pumpkins, niche dark gothic ornament

✨ Core Product Advantages
  1. 🪞 Tiffany stained glass craft: Hand-spliced colored glaze, casts rainbow light spots under sunlight, translucent soft glow effect
  2. 🎨 7 complete Halloween themes: Witch, ghost, black cat, bat, skull, spider & hummingbird for all decoration style preferences
  3. ⚙️ Vintage antique wrought iron frame: Bronze carved vine metal rack with embossed 3D flowers, sturdy, anti-deform & anti-rust
  4. 💎 Multi-layer heavy-duty pendants: Faceted K9 crystal drops, painted metal pumpkins, moon-star charms & colorful bead chains sway softly in wind
  5. 🌿 All-scene atmosphere decor: Perfect for gardens, bay windows, shop windows, B&B furnishings & photography backdrops
  6. 🎁 Unique gift pick: Niche retro gothic design, ideal present for plant lovers, Halloween decor collectors & best friends

📏 Material Specifications
  • Main Body: Tempered colored stained glass + vintage alloy iron
  • Pendants: High-transparent faceted K9 crystal + painted metal Halloween mini ornaments
  • Hanging Chain: Thick rust-proof chain, usable indoors & outdoors
  • Size: 32cm L × 24cm W, crystal drop length 12cm

🏡 Application Scenarios
✅ Outdoor garden, terrace & fence landscape decoration ✅ Indoor bay window, French window & entryway wall hanging ✅ Halloween store window & party venue layout ✅ Autumn aesthetic photo backdrop & short video prop
🧼 Care Instructions
  1. 🌧️ Avoid long-term exposure to heavy rain outdoors; wipe glass regularly with dry cloth to keep light transmission
  2. 🧽 Clean iron frame only with dry cloth, no strong acid & alkaline detergent
  3. 💧 Crystal pendants are fragile, handle gently during moving & storage