Eyeglass

View more
Limit discounts
Short content about your store
Contact us
Short content about your store
Secure payment
Short content about your store
Free delivery worldwide
Short content about your store
(function () { const TAG = "spz-custom-discount-popup-bxgy"; class SpzCustomPlacementPopup extends SPZ.BaseElement { constructor(element) { super(element); this.deviceTypeMap = { PD_PC_MOBILE: "PD_PC_MOBILE", PD_PC: "PD_PC", PD_MOBILE: "PD_MOBILE" }; this.reportEventMap = { PE_IMPRESSION: 'PE_IMPRESSION',//曝光事件 PE_CLICK: 'PE_CLICK',//点击事件 } this.popup_z_index = 1050; } 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 = () => { } // 节流处理 每5s内多次点击 算一次点击上报 throttleReport = this.win.SPZCore.Types.throttle( this.win, (data) => { this.reportData(data) }, 5000 ) // 上报数据 reportData = async(data) => { const reqBody = { placement_id: data.placement_id, event: data.event } this.xhr_.fetchJson(`/api/storefront/promotion/placement/data/report`, { method: "post", body: reqBody }).then((res)=>{ // todo ... }) } doRender_ = (data) => { const popupList = data.popupList || []; if(popupList.length){ // 内容配置 序列化字符转化 popupList.forEach(item => { item.parseConfig = JSON.parse(item.config); }) } return this.templates_ .findAndRenderTemplate(this.element, {popupList}) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }).then(() =>{ popupList.forEach(item => { // buy x get y 弹窗渲染 this.showPopup(item); }) }) } showPopup = async(itemData) => { // 展示弹窗 符合展示条件的弹窗 const $lightbox_item = document.querySelector(`#popup_bxgy_${itemData.id}`); $lightbox_item && SPZ.whenApiDefined($lightbox_item).then((api)=> { const isPC = this.viewport_.getWidth() >= 768; const isMobile = this.viewport_.getWidth() < 768; const isMatchPCDevice = itemData.device === this.deviceTypeMap.PD_PC_MOBILE || itemData.device === this.deviceTypeMap.PD_PC; const isMatchMobileDevice = itemData.device == this.deviceTypeMap.PD_PC_MOBILE || itemData.device === this.deviceTypeMap.PD_MOBILE; if((isPC && isMatchPCDevice) || (isMobile && isMatchMobileDevice)) { // 根据推送时间 延迟展示弹窗 setTimeout(() => { $lightbox_item.style.zIndex = this.popup_z_index; this.popup_z_index ++; api.open(); }, itemData.delay_seconds * 1000); } }) } setupAction_ = () => { this.registerAction('handleTrack', async(invocation) => { // 如果是主题编辑器则不用处理 if(window.top !== window.self) { return; } const data = invocation.args; const event = data.event; // 点击上报 节流处理 if(event === this.reportEventMap.PE_CLICK) { await this.throttleReport(data); } else { this.reportData(data); } }); this.registerAction('handleLinkto', (invocation) => { const url = invocation.args.url; const isNewOpen = invocation.args.isNewOpen; const target = isNewOpen ? '_blank' : '_self'; if(url) { window.open(url, target); } }); } 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, SpzCustomPlacementPopup) })() (function () { const TAG = "spz-custom-discount-placement"; class SpzCustomDiscountPlacement extends SPZ.BaseElement { constructor(element) { super(element); this.placementTypeMap = { PTT_POPUP: "PTT_POPUP", PTT_BANNER: "PTT_BANNER" }; this.placementTemplateMap = { PT_POPUP_BUY_X_GET_Y: "PT_POPUP_BUY_X_GET_Y", PT_BANNER_BUY_X_GET_Y: "PT_BANNER_BUY_X_GET_Y" }; this.progressMap = { PROGRESS_ONGOING: "PROGRESS_ONGOING", PROGRESS_NOT_STARTED: "PROGRESS_NOT_STARTED", PROGRESS_FINISHED: "PROGRESS_FINISHED", PROGRESS_PAUSED: "PROGRESS_PAUSED" }; } 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.handlePlacement(); } // 上报数据 reportData = async(data) => { const reqBody = { placement_id: data.placement_id, event: data.event } const url = `/api/storefront/promotion/placement/data/report`; this.xhr_.fetchJson(url, { method: "post", body: reqBody }).then((res)=>{ // todo ... }) } // 资源位数据获取 getplacementList = async() => { const reqBody = { page_id: window.SHOPLAZZA.meta.page.template_type } const url = `/api/storefront/promotion/placement/list` const data = await this.xhr_.fetchJson(url, { method: "post", body: reqBody }) return data; } handlePlacement = async() => { const res = await this.getplacementList(); const BXGYPopupList = res.list.filter(item => (item.placement_type == this.placementTypeMap.PTT_POPUP && item.placement_template == this.placementTemplateMap.PT_POPUP_BUY_X_GET_Y)); if(BXGYPopupList.length) { const $spz_custom_popup_bxgy = document.querySelector('#spz_custom_popup_bxgy'); SPZ.whenApiDefined($spz_custom_popup_bxgy).then((api)=> { api.doRender_({popupList: BXGYPopupList}); }) } } doRender_ = (data) => { const renderData = data || {}; return this.templates_ .findAndRenderTemplate(this.element, renderData) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }) } setupAction_ = () => { this.registerAction('handleTrack', (invocation) => { const data = invocation.args; this.reportData(data) }); } 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, SpzCustomDiscountPlacement) })()