[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift

[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift

$198.99
$207.63
Free Shipping
BUY NOW, PAY LATER
  • How it works?
  • Select one of the following as your payment method at checkout to pay in interest-free installments:

You must be over 18, a resident of the US, and meet the additional criteria to qualify. Late fees may apply. Loans to California residents made or arranged are pursuant to a California Finance Lenders Law license.

Special Offer Subscribe to Enjoy 10% OFF! Join Now
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
[Retaining Pacifier] Babeside Dolly 12"/16" Realistic Silicone Quiet Baby Girl – A Sweet, Calming Gift
/** * 优惠码组件模型类 * 处理优惠码的显示和交互逻辑 */ class SpzCustomDiscountCodeModel extends SPZ.BaseElement { constructor(element) { super(element); // 复制按钮和内容的类名 this.copyBtnClass = "discount_code_btn" this.copyClass = "discount_code_value" } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } buildCallback() { // 初始化服务 this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); } /** * 渲染优惠码组件 * @param {Object} data - 渲染数据 */ doRender_(data) { return this.templates_ .findAndRenderTemplate(this.element, Object.assign(this.getDefaultData(), data) ) .then((el) => { this.clearDom(); this.element.appendChild(el); // 绑定复制代码功能 this.copyCode(el, data); }); } /** * 获取渲染模板 * @param {Object} data - 渲染数据 */ getRenderTemplate(data) { const renderData = Object.assign(this.getDefaultData(), data); return this.templates_ .findAndRenderTemplate(this.element, renderData) .then((el) => { this.clearDom(); return el; }); } /** * 清除DOM内容 */ clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } /** * 获取默认数据 * @returns {Object} 默认数据对象 */ getDefaultData() { return { isMobile: appDiscountUtils.judgeMobile(), isRTL: appDiscountUtils.judgeRTL(), image_domain: this.win.SHOPLAZZA.image_domain, copyBtnClass: this.copyBtnClass, copyClass: this.copyClass } } /** * 复制优惠码功能 * @param {Element} el - 当前元素 */ copyCode(el) { const copyBtnList = el.querySelectorAll(`.${this.copyBtnClass}`); if (copyBtnList.length > 0) { copyBtnList.forEach(item => { item.onclick = async () => { // 确保获取正确的元素和内容 const codeElement = item.querySelector(`.${this.copyClass}`); if (!codeElement) return; // 获取纯文本内容 const textToCopy = codeElement.innerText.trim(); // 尝试使用现代API,如果失败则使用备用方案 try { if (navigator.clipboard && navigator.clipboard.writeText) { await navigator.clipboard.writeText(textToCopy); } else { throw new Error('Clipboard API not available'); } // 显示复制成功提示 this.showCopySuccessToast(textToCopy, el); } catch (err) { console.error('Modern clipboard API failed, trying fallback...', err); // 使用备用复制方案 this.fallbackCopy(textToCopy, el); } const discountId = item.dataset["discountId"]; // 跳转决策: is_redirection + link(可选覆盖) const setting = { is_redirection: item.dataset["redirection"] === "true", link: item.dataset["link"], }; const landingUrl = `/promotions/discount-default/${discountId}`; const finalUrl = appDiscountUtils.resolveDiscountHref(setting, landingUrl); if (finalUrl && appDiscountUtils.inProductBody(this.element)) { this.win.open(finalUrl, '_blank', 'noopener'); } } }) } } /** * 使用 execCommand 的复制方案 * @param {string} codeText - 要复制的文本 * @param {Element} el - 当前元素 */ fallbackCopy(codeText, el) { const textarea = this.win.document.createElement('textarea'); textarea.value = codeText; // 设置样式使文本框不可见 textarea.style.position = 'fixed'; textarea.style.left = '-9999px'; textarea.style.top = '0'; // 添加 readonly 属性防止移动端虚拟键盘弹出 textarea.setAttribute('readonly', 'readonly'); this.win.document.body.appendChild(textarea); textarea.focus(); textarea.select(); try { this.win.document.execCommand('copy'); // 显示复制成功提示 this.showCopySuccessToast(codeText, el); } catch (err) { console.error('Copy failed:', err); } this.win.document.body.removeChild(textarea); } /** * 创建 Toast 元素 * @returns {Element} 创建的 Toast 元素 */ createToastEl_() { const toast = document.createElement('ljs-toast'); toast.setAttribute('layout', 'nodisplay'); toast.setAttribute('hidden', ''); toast.setAttribute('id', 'discount-code-toast'); toast.style.zIndex = '1051'; return toast; } /** * 挂载 Toast 元素到 body * @returns {Element} 挂载的 Toast 元素 */ mountToastToBody_() { const existingToast = this.win.document.getElementById('discount-code-toast'); if (existingToast) { return existingToast; } const toast = this.createToastEl_(); this.win.document.body.appendChild(toast); return toast; } /** * 复制成功的提醒 * @param {string} codeText - 要复制的文本 * @param {Element} el - 当前元素 */ showCopySuccessToast(codeText, el) { const $toast = this.mountToastToBody_(); SPZ.whenApiDefined($toast).then(toast => { toast.showToast("Discount code copied !"); this.codeCopyInSessionStorage(codeText); }); } /** * 复制优惠码成功后要存一份到本地存储中,购物车使用 * @param {string} codeText - 要复制的文本 */ codeCopyInSessionStorage(codeText) { try { sessionStorage.setItem('other-copied-coupon', codeText); } catch (error) { console.error(error) } } } // 注册自定义元素 SPZ.defineElement('spz-custom-discount-code-model', SpzCustomDiscountCodeModel);
/** * Custom discount code component that handles displaying and managing discount codes * @extends {SPZ.BaseElement} */ class SpzCustomDiscountCode extends SPZ.BaseElement { constructor(element) { super(element); // API endpoint for fetching discount codes this.getDiscountCodeApi = "\/api\/storefront\/promotion\/code\/list"; // Debounce timer for resize events this.timer = null; // Current variant ID this.variantId = "e9511301-08fe-4178-8c46-acee34358c9b"; // Store discount code data this.discountCodeData = {} } /** * Check if layout is supported * @param {string} layout - Layout type * @return {boolean} */ isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } /** * Initialize component after build */ buildCallback() { this.templates_ = SPZServices.templatesForDoc(); this.viewport_ = this.getViewport(); // Bind methods to maintain context this.render = this.render.bind(this); this.resize = this.resize.bind(this); this.switchVariant = this.switchVariant.bind(this); } /** * Setup component when mounted */ mountCallback() { this.getData(); // Add event listeners this.viewport_.onResize(this.resize); this.win.document.addEventListener('dj.variantChange', this.switchVariant); } /** * Cleanup when component is unmounted */ unmountCallback() { this.viewport_.removeResize(this.resize); this.win.document.removeEventListener('dj.variantChange', this.switchVariant); // 清除定时器 if (this.timer) { clearTimeout(this.timer); this.timer = null; } } /** * Handle resize events with debouncing */ resize() { if (this.timer) { clearTimeout(this.timer) this.timer = null; } this.timer = setTimeout(() => { if (appDiscountUtils.inProductBody(this.element)) { this.render(); } else { this.renderSkeleton(); } }, 200); } /** * Handle variant changes * @param {Event} event - Variant change event */ switchVariant(event) { const variant = event.detail.selected; if (variant.product_id == '21242b66-9b9b-4e43-9c3b-4fc84c434d1b' && variant.id != this.variantId) { this.variantId = variant.id; this.getData(); } } /** * Fetch discount code data from API */ getData() { if (appDiscountUtils.inProductBody(this.element)) { const reqBody = { product_id: "21242b66-9b9b-4e43-9c3b-4fc84c434d1b", variant_id: this.variantId, product_type: "default", } if (!reqBody.product_id || !reqBody.variant_id) return; this.discountCodeData = {}; this.win.fetch(this.getDiscountCodeApi, { method: "POST", body: JSON.stringify(reqBody), headers: { "Content-Type": "application/json" } }).then(async (response) => { if (response.ok) { let data = await response.json(); if (data.list && data.list.length > 0) { data.list[0].product_setting.template_config = JSON.parse(data.list[0].product_setting.template_config); // Format timestamps to local timezone const zone = this.win.SHOPLAZZA.shop.time_zone; data.list = data.list.map(item => { if(+item.ends_at !== -1) { item.ends_at = appDiscountUtils.convertTimestampToFormat(+item.ends_at, zone); } item.starts_at = appDiscountUtils.convertTimestampToFormat(+item.starts_at, zone); return item; }); } this.discountCodeData = data; this.render(); } else { this.clearDom(); } }).catch(err => { console.error("discount_code", err) this.clearDom(); }); } else { this.renderSkeleton(); } } /** * Clear component DOM except template */ clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } /** * Render discount codes with formatted dates */ render() { // Render using discount code model SPZ.whenApiDefined(document.querySelector('#spz_custom_discount_code_model')).then(renderApi => { renderApi.doRender_({ discountCodeData: this.discountCodeData }) }).catch(err => { this.clearDom(); }) } renderSkeleton() { // Render template for non-product pages this.templates_ .findAndRenderTemplate(this.element, { isMobile: appDiscountUtils.judgeMobile() }) .then((el) => { this.clearDom(); this.element.appendChild(el); }) .catch(err => { this.clearDom(); }); } } // Register custom element SPZ.defineElement('spz-custom-discount-code', SpzCustomDiscountCode);
const TAG = "spz-custom-product-automatic"; class SpzCustomProductAutomatic extends SPZ.BaseElement { constructor(element) { super(element); this.variant_id = 'e9511301-08fe-4178-8c46-acee34358c9b'; 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 = '21242b66-9b9b-4e43-9c3b-4fc84c434d1b'; 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 == '21242b66-9b9b-4e43-9c3b-4fc84c434d1b' && 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 = '21242b66-9b9b-4e43-9c3b-4fc84c434d1b'; 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);
class SpzCustomDiscountFlashsale extends SPZ.BaseElement { constructor(element) { super(element); this.xhr_ = SPZServices.xhrFor(this.win); this.getFlashSaleApi = "\/api\/storefront\/promotion\/flashsale\/display_setting\/product_setting"; this.timer = null; this.variantId = "e9511301-08fe-4178-8c46-acee34358c9b"; // 促销活动数据 this.flashsaleData = {} } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback() { this.templates_ = SPZServices.templatesForDoc(); this.viewport_ = this.getViewport(); // 挂载bind函数 解决this指向问题 this.render = this.render.bind(this); this.resize = this.resize.bind(this); this.switchVariant = this.switchVariant.bind(this); } mountCallback() { // 获取数据 this.getData(); this.element.onclick = (e) => { const cur = this.win.document.querySelector(".app_discount_flashsale_desc"); const setting = this.flashsaleData.product_setting; const landingUrl = `/promotions/discount-default/${this.flashsaleData.discount_info.id}`; const finalUrl = appDiscountUtils.resolveDiscountHref(setting, landingUrl); if (finalUrl && appDiscountUtils.inProductBody(this.element) && e.target !== cur) { this.win.open(finalUrl, '_blank', 'noopener'); } } // 绑定 this.viewport_.onResize(this.resize); // 监听子款式切换,重新渲染 this.win.document.addEventListener('dj.variantChange', this.switchVariant); } unmountCallback() { // 解绑 this.viewport_.removeResize(this.resize); this.win.document.removeEventListener('dj.variantChange', this.switchVariant); // 清除定时器 if (this.timer) { clearTimeout(this.timer); this.timer = null; } } resize() { if (this.timer) { clearTimeout(this.timer) this.timer = null; } this.timer = setTimeout(() => { this.render(); }, 200) } switchVariant(event) { const variant = event.detail.selected; if (variant.product_id == '21242b66-9b9b-4e43-9c3b-4fc84c434d1b' && variant.id != this.variantId) { this.variantId = variant.id; this.getData(); } } getData() { const reqBody = { product_id: "21242b66-9b9b-4e43-9c3b-4fc84c434d1b", product_type: "default", variant_id: this.variantId } this.flashsaleData = {}; this.win.fetch(this.getFlashSaleApi, { method: "POST", body: JSON.stringify(reqBody), headers: { "Content-Type": "application/json" } }).then(async (response) => { if (response.ok) { this.flashsaleData = await response.json(); this.render(); } else { this.clearDom(); } }).catch(err => { this.clearDom(); }); } clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } render() { this.templates_ .findAndRenderTemplate(this.element, { isMobile: appDiscountUtils.judgeMobile(), isRTL: appDiscountUtils.judgeRTL(), inProductDetail: appDiscountUtils.inProductBody(this.element), flashsaleData: this.flashsaleData, image_domain: this.win.SHOPLAZZA.image_domain, }) .then((el) => { this.clearDom(); this.element.appendChild(el); }) } } SPZ.defineElement('spz-custom-discount-flashsale', SpzCustomDiscountFlashsale);
The current produc does not participate any Rebate. Switch the participating product to check the design.
(This prompt will not be displayed on the client-side.)
var theme = window.C_SETTINGS && C_SETTINGS.theme && C_SETTINGS.theme.merchant_theme_name; var isFlash = /Flash/gi.test(theme); var isGeek = /Geek/gi.test(theme); var isNova23 = /Nova 2023/gi.test(theme); var isWind = /Wind/gi.test(theme); var isOnePage = /OnePage/gi.test(theme); var isHero = /Hero/gi.test(theme); var isBoost = /Boost/gi.test(theme); var isEva = /Eva/gi.test(theme); var isFarida = /Farida/gi.test(theme); var isPluto = /Pluto/gi.test(theme); var isLifeStyle = /Life Style/gi.test(theme); if(window.self === window.top) { (window.disabled_exts ||=[]).push('product_detail_rebate'); } class SpzRebateComponent extends SPZ.BaseElement { constructor(element) { super(element); } xhr_ = SPZServices.xhrFor(this.win); viewport_ = this.getViewport(); action_ = null; lang = document.documentElement.lang || 'en-US'; landPage = "\/promotions\/rebate\/"; pageType = 1; cart = []; initData = null; rebateInfo = null; renderData = null; footerImage = `${this.win.SHOPLAZZA["image_domain"]}oss/operation/e8ebb03dbb710457ca3b4b6a70898ab2.svg`; isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } buildCallback() { this.initData = this.getProduct(); this.action_ = SPZServices.actionServiceForDoc(this.element); this.registerAction("triggerGetRenderData", () => { const event = SPZUtils.Event.create(this.win, "triggerGetRenderData", this.renderData); this.action_.trigger(this.element, "getRenderData", event); }); this.registerAction("bindPropagation", () => { document.querySelector(".product_detail_rebate_list").addEventListener("click", e => { e.stopPropagation(); this.win.sa && this.win.sa.track("plugin_rebate_promotion_click", { plugin_timestamp: Date.now(), plugin_location: "info", product_id: this.initData.product.id, discount_id: this.rebateInfo.discount_list.map((item) => item.discount_id)[0], }); }); }); } async mountCallback() { document.addEventListener("dj.variantChange", e => { const data = e.detail; if (document.querySelector("#product-select-modal.show")) return; this.initData = this.getProductJson(data); if (this.initData && this.initData.product && data.product && this.initData.product.id === data.product.id) { this.initRebate(this.initData, true); } else { this.getRebateInfo(); } }); document.addEventListener("dj.addToCart", e => { const v = e.detail; this.rebateInfo && this.win.sa && this.win.sa.track("plugin_rebate_atc", { variant_discount_id: this.getVariantDiscountId(v.variant_id).map(item => item.discount_id), discount_ids: this.rebateInfo.discount_list.map(item => item.discount_id), variant_id: v.variant_id, product_id: v.product_id, price: v.item_price, number: v.number, }); }); await this.getRebateInfo(); setTimeout(()=>{ if (document.querySelector(".plugin-container__bottom-fixed")) { this.showDiscountPopupsInfoBar(); } else { this.win.addEventListener("extloaded", () => { this.showDiscountPopupsInfoBar(); }); } },1000) } getProductJson = (mergeData = {}) => { const productJson = document.querySelector("#product-json"); let productJsonData = {}; if (productJson && productJson.textContent) { try { productJsonData = JSON.parse(productJson.textContent); } catch (e) {} } // 深度合并函数 const deepMerge = (target, source) => { if (source === null || source === undefined) { return target; } if (typeof source !== 'object' || Array.isArray(source)) { return source; } const result = { ...target }; for (const key in source) { if (source.hasOwnProperty(key)) { if ( typeof source[key] === 'object' && source[key] !== null && !Array.isArray(source[key]) && typeof target[key] === 'object' && target[key] !== null && !Array.isArray(target[key]) ) { result[key] = deepMerge(target[key], source[key]); } else { result[key] = source[key]; } } } return result; }; return deepMerge(productJsonData, mergeData); } getProduct = (() => { document.addEventListener("dj.variantChange", e => { if (!e.detail || !e.detail.product) return; let productJsonData = getProductJson(e.detail); if (this.win.jQuery && this.win.jQuery.fn && this.win.jQuery(document).data("djproduct") && productJsonData) { this.win.jQuery(document).data("djproduct", productJsonData); } }); return () => { let productData = null; if (this.win.jQuery && this.win.jQuery.fn) { try { let product = this.win.jQuery(document).data("djproduct"); if (product) { productData = JSON.parse(JSON.stringify(product)); } else { productData = null; } } catch (error) { productData = null; } } if (!productData) { const productJson = document.querySelector("#product-json"); productData = (productJson && productJson.textContent && JSON.parse(productJson.textContent)) || null; } return productData; }; })(); clearRebateInfoDom = () => { // 1. 清除 apis.render 渲染的 DOM (app_rebate_section) const rebateSection = document.getElementById('app_rebate_section'); if (rebateSection) { const rebateRuleSection = rebateSection.querySelector('.rebate_rule_section'); if (rebateRuleSection) { rebateRuleSection.remove(); } } // 2. 清除 templates_.renderTemplate 渲染的 DOM (app_rebate_block) const rebateBlock = document.getElementById('app_rebate_block'); if (rebateBlock) { const appRebateList = rebateBlock.querySelector('.app_rebate_list'); if (appRebateList) { appRebateList.remove(); } } // 3. 清除 insertProductDetailRebateTag 插入的 DOM // 清除所有 rebate-tag 元素 document.querySelectorAll('.slider-discount-tag.dj_skin_product_title.rebate-tag').forEach(tag => { tag.remove(); }); // 移除 data-rebate-tag 属性 const productContainer = document.querySelector('.product-details, .product-details, .page_container, .product-images, [data-section-type="product"]'); if (productContainer && productContainer.hasAttribute('data-rebate-tag')) { productContainer.removeAttribute('data-rebate-tag'); } }; initRebate = this.win.SPZCore.Types.debounce( this.win, (async (data) => { let discount_list = Object.assign([], this.rebateInfo?.discount_list); /* 按子商品的多少对优惠信息进行排序 */ discount_list && discount_list.sort((a, b) => { return b.variant_ids.length - a.variant_ids.length; }); /* 选中子商品时 筛选子商品的优惠信息 */ if (data.selected && data.selected.id) { discount_list = this.getVariantDiscountId(data.selected.id); } /* 无满减信息 */ if (!(discount_list && discount_list.length)) { this.clearRebateInfoDom(); return; } const isSection = !!document.querySelector( `div[data-section-type^="shoplazza://apps/publicapp/blocks/rebate"] #rebate_custom_component` ); if ( (this.rebateInfo.rebate_type == "sku" && data && data.selected && data.selected.id) || this.rebateInfo.rebate_type == "spu" ) { let nowLandpage = this.landPage; if (discount_list[0]) { nowLandpage = this.landPage + discount_list[0].discount_id || ""; } const info = { rebate: discount_list[0], maxShowCount: this.win.innerWidth > 768 ? 3 : 1, landPage: nowLandpage, modalFooterImg: `url(${`${this.win.SHOPLAZZA["image_domain"]}oss/operation/e8ebb03dbb710457ca3b4b6a70898ab2.svg`})`, }; this.renderData = info; if(isSection) { SPZ.whenApiDefined( document.getElementById("app_rebate_section") ).then(apis => { apis.render(info, true); }); } else { // 重新渲染 抖动问题处理 this.templates_ = SPZServices.templatesForDoc(this.element); const rebateBlockHost = document.getElementById('app_rebate_block'); const newTplDom = await this.templates_.findAndRenderTemplate(rebateBlockHost, info) const parentDiv = document.querySelector('#app_rebate_block'); const oldDom = parentDiv.querySelector('.app_rebate_list'); if(oldDom){ parentDiv.replaceChild(newTplDom, oldDom); } else { parentDiv.appendChild(newTplDom); } } } this.insertProductDetailRebateTag(this.rebateInfo.tag); var pluginCurrencyEvent = new CustomEvent("plugin_currency_update"); document.dispatchEvent(pluginCurrencyEvent); }).bind(this), 10 ); getRebateInfo = async () => { if (this.initData && this.initData.product && this.initData.product.id) { var variant_ids = this.initData.product.variants.map(variant => variant.id); const res = await this.xhr_.fetchJson( "\/api\/discount-rebate\/product-discount", { method: "POST", body: { product_id: this.initData.product.id, product_type: this.initData.product.product_type, variant_ids: variant_ids, }, } ); if (!SPZCore.Types.isEmptyObject(res.rebate_info)) { res.rebate_info.tag = res.tag; res.rebate_info.rebate_type = res.rebate_type; this.rebateInfo = res.rebate_info; this.initRebate(this.initData); } else { if (this.win.top !== this.win.self) { const noActivity = document.getElementById("no-rebate-activity"); noActivity && (noActivity["style"].display = "block"); } } } }; getVariantDiscountId = (variant_id) => { if (!variant_id || !this.rebateInfo) return []; var rebateId = this.rebateInfo.variant_discount_map[variant_id]; return this.rebateInfo.discount_list.filter(item => item.discount_id == rebateId) || []; }; insertProductDetailRebateTag = (tag) => { if (!tag) return // 旧判断逻辑 const productSelectModal = document.querySelector('#product-select-modal'); if (productSelectModal && productSelectModal.classList.contains('show')) { return; } setTimeout(() => { var $tag_container = []; if (isNova23) { $tag_container = document.querySelectorAll('.product-details .product-images-container'); } else if (isFlash) { $tag_container = document.querySelectorAll('.product-detail .product-images .product-main-images-container'); } else if (isGeek) { $tag_container = document.querySelectorAll('.product-images #product-images-inner-container spz-carousel .i-spzhtml-slide-item'); } else if (isWind) { $tag_container = document.querySelectorAll('.product-detail .product-images-container .i-spzhtml-slides-container'); } else if (isOnePage) { $tag_container = document.querySelectorAll('.product-details .product-main-images'); } else if (isHero) { $tag_container = document.querySelectorAll('.product-detail #product-images-container #product-images-carousel .spz-carousel-slide'); } else if (isBoost) { $tag_container = document.querySelectorAll('.boost-product-detail .product-image__layout-list .slides .slides-item .product-info__slide .slider-zoom'); } else if (isEva) { $tag_container = document.querySelectorAll('.page_container [data-section-type="product"] .support-slick'); } else if (isFarida) { $tag_container = document.querySelectorAll('.product-details .product-images-container'); } else if (isLifeStyle) { $tag_container = document.querySelectorAll('.page_container [data-section-type="product_detail"] .sep-slider,.support-slick'); } else if (isPluto) { $tag_container = document.querySelectorAll('.page_container [data-section-type="product_detail"] .sep-slider,.support-slick'); } if($tag_container.length === 0) return; // 给商祥页添加满送插件的标识属性 const $product_container = document.querySelector('.product-details, .product-details, .page_container, .product-images, [data-section-type="product"]') if($product_container) { $product_container.setAttribute('data-rebate-tag', 'true'); } // 部分主题需要调整样式 if (isWind) { Array.from($tag_container).forEach(container => { container.style.position = 'relative'; }); } document.querySelectorAll('.slider-discount-tag.dj_skin_product_title.rebate-tag').forEach(tag => tag.remove()); // 遍历所有容器并插入标签 Array.from($tag_container).forEach(container => { container.insertAdjacentHTML('beforeend', `<div class="slider-discount-tag dj_skin_product_title rebate-tag">${tag}</div>`); }); }, 1000) }; fetchInfoBar = async () => { let discount_ids = []; if (this.pageType === 1) { discount_ids = this.rebateInfo && this.rebateInfo.discount_list.map(item => item.discount_id); } else if (this.pageType === 38) { discount_ids = [this.win.rebateObj.rebateCollection_id] || []; } const productObj = this.getProduct(); const { cart } = await this.xhr_.fetchJson('/api/cart') return this.xhr_.fetchJson("\/api\/discount-rebate\/global-text", { method: "POST", body: { product_type: productObj && productObj.product && productObj.product.product_type, line_items: (cart?.line_items || []).map(item => ({ variant_id: item.variant_id, product_id: item.product_id, quantity: item.quantity, price: item.price, selected: !item.unchecked, })), discount_ids: discount_ids, }, }); }; renderBottomBanner = res => { if (!res.tips) return; document.querySelector(".discount__info-bar")?.remove(); var bar_style = `background:linear-gradient(90deg,${res.config.background_color_start},${res.config.background_color_end}); color:${res.config.color};`; let data = { tips: res.tips, landPage: this.landPage + res.id, bar_style }; const html = SPZCore.Dom.htmlFor(this.element); const banner = html([ `<a impr="1" imprevt="1" id="rebate_bottom_bar" href=${data.landPage} class="discount__info-bar text-truncate" data-activity-type="rebate" style="${data.bar_style}">${data.tips}</a>`, ]); document.querySelector(".plugin-container__bottom-fixed").appendChild(banner); const pluginCurrencyEvent = new CustomEvent("plugin_currency_update"); document.dispatchEvent(pluginCurrencyEvent); if (res.id) { var trackParams = { page: this.pageType, discount_id: res.id, product_id: this.getProduct()?.product.id, }; banner.addEventListener("click", () => { this.win.sa && this.win.sa.track("plugin_rebate_promotion_click", { plugin_timestamp: Date.now(), plugin_location: "bottom_bar", product_id: trackParams.product_id, discount_id: trackParams.discount_id, }); }); this.win.sa && this.win.sa.track("plugin_rebate_banner_pv", trackParams); } }; showDiscountPopupsInfoBar = () => { if ([13, 14, 19, 30, 31].includes(this.pageType)) return; if (document.querySelector(".plugin-container__bottom-fixed .discount__info-bar")) return; this.fetchInfoBar().then(this.renderBottomBanner); document.addEventListener("dj.cartChange", () => { this.fetchInfoBar().then(this.renderBottomBanner); }); }; } SPZ.defineElement("spz-custom-rebate", SpzRebateComponent);
(function () { try { const getProduct = () => { const productJson = document.querySelector('#product-json'); if (productJson?.textContent) { return JSON.parse(productJson.textContent); } if (window.jQuery) { const $product = window.jQuery?.(document)?.data('djproduct'); const productData = JSON.parse(JSON.stringify($product || {})); return productData || {}; } return {}; }; const blockDomId = 'pm-block-afterpay-message-1539149753700-8' const placeholderDomId = 'pm-block-afterpay-message-placeholder-1539149753700-8' const badgeTheme = "black-on-mint"; const size = "md"; const shopCurrencyCode = "USD"; const productDetail = getProduct(); let productPrice = productDetail?.selected?.price || 198.99; let settingConfig; const req = { ROOT_URL: (C_SETTINGS && C_SETTINGS.routes && C_SETTINGS.routes.root) || '', post: async (url, data = {}) => { try { const response = await fetch(req.ROOT_URL + url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, ...data, body: JSON.stringify(data.body), }); const result = await response.json(); return result } catch (error) { throw new Error('post request error' + error); } }, get: async (url, data = {}) => { try { const response = await fetch(req.ROOT_URL + url); const result = await response.json(); return result } catch (error) { throw new Error('get request error' + error); } } } const supportLocaleMap = { AU: 'en-AU', NZ: 'en-NZ', US: 'en-US', CA: 'en-CA', GB: 'en-GB', FR: 'fr-FR', IT: 'it-IT', ES: 'es-ES', DE: 'de-DE', } const getPayLaterSetting = () => { return req.post('/api/payment/pay-later-setting', {body: {payment_channel: 'afterpay'}}).then(res => { const result = { ...res, afterpay_currency_locale: supportLocaleMap?.[res?.afterpay_support_country?.[0]] || supportLocaleMap?.US || 'en-US' } return result; }); } const getBlockDom = () => { const blockDOM = document.getElementById(blockDomId); if (!blockDOM) { return; } return blockDOM } function errorHandler() { const blockDOM = getBlockDom(); if (blockDOM) { blockDOM.style.display = 'none'; } } function hasAfterpayMessage() { // 获取目标元素 const targetElement = document.getElementById(placeholderDomId); // 判断目标元素是否有兄弟元素节点 const siblings = Array.from(targetElement.parentNode.children).filter(function (node) { return node.nodeType === Node.ELEMENT_NODE; }); return siblings.length > 1 } function renderAfterpay(data = {}) { const blockDOM = getBlockDom(); if (!blockDOM) { return; } blockDOM.innerHTML = null; const placeholderDOM = document.createElement('div'); placeholderDOM.id = placeholderDomId; placeholderDOM.className = 'pm-display-none' blockDOM.appendChild(placeholderDOM); blockDOM.style.display = 'block'; if (window.Afterpay && typeof Afterpay?.createPlacements === 'function' && !hasAfterpayMessage()) { try { Afterpay.createPlacements({ targetSelector: `#${placeholderDomId}`, attributes: { locale: data.afterpay_currency_locale, currency: data.afterpay_currency, amount: data.productPrice, size: size, badgeTheme: badgeTheme, } }); } catch (e) { console.error('payment-sdk:', e); } } } async function init(data = {}) { const blockDOM = getBlockDom(); if (!blockDOM) { return; } if (!settingConfig) { settingConfig = await getPayLaterSetting(); } if(data?.detail?.selected?.price){ productPrice = data?.detail?.selected?.price; } if ( !settingConfig || !settingConfig.afterpay_promo_msg_enabled || !settingConfig.afterpay_max_amount || !settingConfig.afterpay_min_amount || !settingConfig.afterpay_support_country || shopCurrencyCode !== settingConfig.afterpay_currency || Number(productPrice) <= Number(settingConfig.afterpay_min_amount) || Number(productPrice) > Number(settingConfig.afterpay_max_amount) ) { errorHandler(); return; } const scriptDOM = document.getElementById('pm-afterpay-sdk'); if (!scriptDOM) { window.addEventListener('Afterpay.ready', () => renderAfterpay({ ...settingConfig, productPrice })); const afterpaySDK = document.createElement('script'); afterpaySDK.id = 'pm-afterpay-sdk' afterpaySDK.src = 'https://js.afterpay.com/afterpay-1.x.js'; afterpaySDK.setAttribute('data-analytics-enabled', ''); afterpaySDK.setAttribute('data-min', settingConfig.afterpay_min_amount); afterpaySDK.setAttribute('data-max', settingConfig.afterpay_max_amount); afterpaySDK.async = true; afterpaySDK.onerror = errorHandler; document.body.appendChild(afterpaySDK); } else { renderAfterpay({...settingConfig, productPrice}); } } document.addEventListener('dj.variantChange', init); init(); } catch (e) { console.error('payment-sdk-afterpaymessage:', e) } })()
Style-Pink Tartan
Please select a style
Gender-Girl
Please select a gender
Size-16 Inches
Please select a size
Quantity

Buy Together, Get More

Free Shipping on Orders $149+
30-Day Free Returns & Exchanges
Hand-Made & Secure Payments
Soft & Safe Silicone
Handcrafted Details
Gift-Ready Choice
Need to Know

Dolly is a bright-eyed full-silicone baby girl designed with a comforting weighted feel, hand-finished details, and a pacifier-ready mouth that makes every nurturing moment feel more lifelike.

Product Details:

Name: Dolly

Type: Open-Eyed Full-Silicone Reborn Baby Doll

Gender: Girl

Doll Style: Little Infant

Recommended Age: 3+ Year

Size Options: 12" (30 cm) / 16" (40 cm)

Weight:

12": Approx. 1.50 kg (3.31 lbs)

16": Approx. 2.50 kg (5.51 lbs)

Materials & Craftsmanship: High-Quality Platinum Silicone from Head to Toe.

Eyes: Always open and cannot close.

Hair Options: Smooth bald head or short hand-rooted hair, depending on the selected style.

Mouth: Sculpted oral cavity designed to hold a pacifier.

Her seamless full-silicone construction gives Dolly a soft, flexible, and substantial feel, allowing her to settle naturally in your arms.

Every Dolly is carefully finished with handcrafted details:

Hand-painted skin tones, soft blush, and subtle veins;

Individually shaded lips, nails, fingers, and toes;

Hand-rooted eyelashes framing her bright open eyes.

Available with a smooth bald head or short hand-rooted hair

What Makes Dolly Special?

✓ A Pacifier-Ready Mouth

Dolly’s sculpted oral cavity is designed to hold a pacifier comfortably, creating a more natural feeding and soothing experience during nurturing play.

✓ Comforting Weighted Silicone Body

Made entirely from platinum silicone, Dolly has a soft yet substantial feel that rests naturally against your arms during cuddling and caregiving moments.

✓ Bright, Open-Eyed Personality

Her always-open eyes, softly parted lips, and rounded cheeks capture the curious expression of a little infant quietly taking in the world.

✓ Ready for Nurturing Play

Dolly arrives with a removable outfit, pacifiers, a nursing bottle, two rattles, and a birth certificate—making her ready for imaginative care or gift-giving.

Care Instructions

Dolly is crafted from full platinum silicone with hand-painted details, rooted features, and a sculpted oral cavity. Gentle care will help preserve her soft texture and lifelike finish.

✓ Bathe Her Gently

Dolly may be given a brief bath using lukewarm water and a small amount of mild, fragrance-free soap. Never use hot water, scrub her skin, or leave her soaking for extended periods. Pat her completely dry with a soft towel.

✓ Keep Her Mouth Clean

Use only a soft, properly sized pacifier and insert or remove it gently. Never place sharp, hard, or oversized objects inside her mouth. Rinse the oral cavity carefully when needed and allow it to dry thoroughly.

✓ Protect Her Handcrafted Details

Avoid alcohol, bleach, solvents, oils, lotions, cosmetics, powders, and abrasive cleaners. Do not rub or pull the rooted eyelashes or hair. Keep dark or unwashed fabrics away from the silicone to help prevent color transfer.

✓ Handle and Store Her Thoughtfully

Support Dolly’s head and body with both hands, especially the heavier 16-inch size. Do not pull, twist, or overstretch her limbs, fingers, or toes. Store her in a cool, dry place away from direct sunlight, high heat, sharp objects, and heavy pressure.

Mother and children with dolls

What's Included

Accessories may vary by selected style and size. Please refer to the current product photos and selected variant for exact included items.

photo photo
Reborn Doll
photo photo
Hairband
photo photo
Cloth
photo photo
Package
photo photo
Bear Rattle
photo photo
Baby Bottle
photo photo
Diaper
photo photo
Birth Certificate
photo photo
Instruction
photo photo
ID Band

Meet Dolly — A Little Gaze, A World of Wonder

Mother and children with dolls Mother and children with dolls
Why Families Love Dolly
photo photo
A Comforting Weight in Your Arms
Dolly’s soft, weighted full-silicone body settles naturally against you, creating a reassuring cuddle that feels wonderfully lifelike.
photo photo
A Bright-Eyed Face Full of Wonder
Wide-open eyes, hand-rooted lashes, hand-painted blush, and softly parted lips give Dolly a curious, expressive look that draws you closer.
photo photo
Made for Natural Nurturing Moments
Her flexible full-silicone body rests beautifully in sitting or reclining positions—perfect for dressing, cuddling, photography, and imaginative care.
Mother and children with dolls
Soft Cheeks & a Pacifier-Ready Mouth
Designed for More Natural Care Moments

Dolly’s platinum-silicone face gently responds to touch, while her sculpted oral cavity adds more realism to soothing play:

Soft cheeks compress under gentle pressure;

Silicone gradually returns to its original shape;

Sculpted mouth comfortably holds a pacifier;

Softly parted lips create a lifelike infant expression.

Mother and children with dolls Mother and children with dolls
Mother and children with dolls
Hand-Finished Down to Her Tiny Toes
Little Details Worth a Closer Look

Dolly’s feet are carefully painted and textured to capture the delicate features found on a little infant:

Fine creases sculpted across the soles;

Individually shaded toes and nail beds;

Subtle blush around the feet and joints;

Hand-finished variations make every Dolly unique.

Mother and children with dolls Mother and children with dolls
Mother and children with dolls
A Bright-Eyed Moment of Wonder
Curiosity Captured in Her Expression

Dolly’s open-eyed sculpt was inspired by the quiet moments when a little infant lies comfortably, watching the world around her:

Bright eyes that always remain open;

Hand-rooted lashes add delicate definition;

Slightly parted lips soften her expression;

A relaxed posture creates a calm, curious presence.

Mother and children with dolls Mother and children with dolls