class Base { constructor() { } load() { this.footer(); this.header(); if ($('.counter').length) { $('.counter').countUp(); } } header() { layui.use(['form', 'layer'], function () { $('#headSearchBtn').click(function () { var form = layui.form; var layer = layui.layer; layer.open({ maxWidth: 1000, type: 1, zIndex: 9999, title: false, content: $('#headSearch') }) }) }) headToggle(); mobileMenuToggle() scroll() $(window).scroll(function () { scroll() }) $(".head-drop").hover(function () { let h = $(this).find(".inner").outerHeight(); if ($(this).find(".head-dropinfo").hasClass("_product")) { h = $(window).height() - 140; } $(this).find(".head-dropinfo").height(h) $("#dropCover").addClass("on") }, function () { $("#dropCover").removeClass("on") $(this).find(".head-dropinfo").height(0) }) function scroll() { var st = $(window).scrollTop(); if (st >= 70) { $('header').addClass('fixed'); } else { $('header').removeClass('fixed'); if (!$("header").hasClass("substation")) { } } } function headToggle() { $('#menuBtn').click(function () { var flag = $(this).hasClass('on'); if (!flag) { $(this).addClass("on"); $('#nav').addClass("active"); $('header').addClass("active"); } else { $(this).removeClass("on"); $('#nav').removeClass("active"); $('header').removeClass("active"); } }) } function mobileMenuToggle() { $('#menus .xsdrop .tit').click(function () { let parent = $(this).parent(); if (parent.hasClass('open')) { parent.removeClass('open') $(this).siblings('.xs-menu').slideUp() } else { parent.siblings().removeClass("open") parent.siblings().find('.xs-menu').slideUp(); parent.addClass('open') $(this).siblings('.xs-menu').eq(0).slideDown() } }) // $('#menus .xsdrop .arr').click(function () { // let parent = $(this).parent().parent(); // if(!$(this).siblings("tit").attr("href")){ // return false; // } // if (parent.hasClass('open')) { // parent.removeClass('open') // $(this).parent().siblings('.xs-menu').slideUp() // } else { // parent.siblings().removeClass("open") // parent.siblings().find('.xs-menu').slideUp(); // parent.addClass('open') // $(this).parent().siblings('.xs-menu').slideDown() // } // }) } } footer() { fn(); $(window).resize(fn) function fn() { $('#ftNavs').off('click', '.navitem h4'); var flag = $('#ftNavs .icon-jia').eq(0).css('display') == 'block'; if (flag) { $('#ftNavs .navitem .info').hide() $('#ftNavs').on('click', '.navitem h4', toggle); } else { $('#ftNavs .navitem .info').show() } } function toggle() { var item = $(this).parent('.navitem'); item.toggleClass('active') $(this).siblings('.info').slideToggle(100); item.siblings('.navitem').removeClass('active').each(function () { $(this).find('.icon-jia').removeClass('active') $(this).find('.info').slideUp(100) }) } } tab() { $('.tabNav >*').click(function () { var index = $(this).index(); var content = $(this).addClass('on').siblings().removeClass('on').parents('.tabJs').find('.tabInfo'); var contentItem = content.find('.cItem'); contentItem.eq(index).addClass('on').siblings().removeClass('on'); return false; }) $('.tabNavHv >*').mouseover(function () { if ($(this).hasClass("on")) { return false } let index = $(this).index(); $(this).addClass('on').siblings().removeClass('on'); var tabInfo = $(this).parents('.tabWrap').find('.tabInfo'); var tabItems = tabInfo.find('.cItem'); tabInfo.find('.on').removeClass('on'); tabItems.eq(index).addClass('on').css("opacity", 0); setTimeout(function () { tabItems.eq(index).css("opacity", 1); }, 100) }) } wow() { var wow = new WOW({ boxClass: 'wow', animateClass: 'animated', offset: 0, mobile: false, live: true }); new WOW().init(); } totop() { $('.totop').on('click', function () { $('html,body').animate({ scrollTop: 0 }, 300) }) // $(window).scroll(function () { // var st = $(window).scrollTop(); // if (st >= $(window).height() / 2) { // $('#top').addClass('show'); // } else { // $('#top').removeClass('show'); // } // }) } mobileUrl() { $('.mobileUrl').click(function () { let url = $(this).attr('data-url'); if ($(window).width() <= 768) { location.href = url; } }) } /** * 跨页面跳转 */ navLink(obj) { obj.on('click', function () { var id = $(this).attr('data-id'); var link = $(this).attr('href'); if (id) { localStorage.setItem('__todom__', id); } location.href = link; return false; }) window.onload = function () { var getobj = localStorage.getItem('__todom__'); setTimeout(function () { if (getobj) { var obj = $('#' + getobj); var headheight = $('header').height(); headheight = Math.max(60, headheight); var top = obj.offset().top - headheight; $('html,body').scrollTop(top); localStorage.removeItem('__todom__'); } }); } } // 二级固定分类 secondFixedNav() { if ($(".fixed_nav_box").length) { let objT = $(".fixed_nav_box").offset().top; let domItem = $(".fixed_nav_box .pageToDom"); let arr = []; let current = 0; let headerHeight = $('header').height(); let wh = $(window).height(); domItem.each(function () { let id = $(this).attr("href"); if (id.substring(0, 1) == '#') { arr.push(parseInt($(id).offset().top)); } }) $(window).scroll(fn) fn() function fn() { let st = $(window).scrollTop(); if (st > objT - headerHeight) { $(".fixed_nav_box").addClass("fixed") } else { $(".fixed_nav_box").removeClass("fixed") } if (arr) { arr.map((item, index) => { if (st + wh / 2 > item && index != current) { current = index; domItem.eq(index).addClass("on").siblings().removeClass("on") } }) } } } } /** * 在本页面页跳转 * */ pageToDom(obj) { obj.click(function () { var href = $(this).attr('href'); var dom = $(href); var headheight = $('header').height() >= 60 ? $('header').height() : 70; let addHeight = $(this).data("addheight"); var top = dom.offset().top - headheight; if(addHeight){ top -= $(addHeight).height()-2; } $('html,body').animate({ scrollTop: top }, 300); return false; }) } // 产品栏目 productMenu() { $("#productMenuBtn").click(function () { $(".menu_top").toggleClass("open"); $(".menu_list").slideToggle() }) $(".productMenu .arr").click(function () { let parent = $(this).parent().parent(); parent.siblings().removeClass("open"); parent.siblings().find("dd").slideUp() parent.find("dd").slideToggle(); parent.toggleClass('open'); }) } layerScale() { if ($("#layer-photos").length) { layui.use(['layer'], function () { var layer = layui.layer; layer.photos({ photos: '#layer-photos' , anim: 5 }) }); } $(".scaleImg").click(function () { let src = $(this).attr("src"); layer.photos({ photos: { "data": [ { src } ] } , anim: 5 }); }) } index_banner() { var bannerSwiper = new Swiper('.index_banner', { loop: true, autoplay: true, effect: "fade", centeredSlides: true, navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev', }, pagination: { el: '.swiper-pagination', clickable: true, renderBullet: function (index, className) { return '' + (index + 1) + ''; }, }, on:{ slideChange: function(){ if($('.index_banner').find('video').length){ $('.index_banner').find('video').remove(); $(".index_banner .ic-play").show(); bannerSwiper.autoplay.start(); } }, }, }) $(".index_banner .ic-play").click(function () { bannerSwiper.autoplay.stop(); let url = $(this).attr("video"); if($(this).hasClass("lg")){ layer.open({ type: 2, title: false, // closeBtn: 0, skin:"layer-banner-video", maxWidth:"1200px", maxHeight:"800px", shade: 0.8, shadeClose: true, // content: $("#bannerVideo"), // success:function(){ // $(".bannerVideo").attr("autoplay",true) // }, content: url, cancel:function(){ // canplay = true; bannerSwiper.slideNext(); } }) }else{ let str = ``; $(this).parent().append(str); $(this).hide() } }) } } $(function () { let doc = new Base(); doc.load(); doc.tab(); doc.totop(); doc.wow() doc.index_banner() doc.productMenu() doc.mobileUrl() doc.layerScale() doc.navLink($(".navLink")) doc.pageToDom($(".pageToDom")) doc.secondFixedNav() $(".toTop").click(function () { $('html,body').animate({ scrollTop: 0 }, 300) return false; }) $(".article video").each(function(){ $(this).attr("height",'auto'); $(this).attr("width",'100%'); $(this).css({"max-width":'710px','mragin':'0 auto'}); }) }) function submit(name = '*') { layui.use(['layer', 'form', 'upload', 'element'], function () { var form = layui.form; var layer = layui.layer; var upload = layui.upload; var element = layui.element; let loadindex = null; var uploadInst = upload.render({ elem: ".uploadbtn" // , url: '/addons/qiniu/index/upload' , url: '/api/common/upload' , accept: 'file' , size: 20 * 1024 , exts: 'jpg|png|bmp|jpeg|gif|zip|rar|xls|xlsx|pdf|docx|mp4|doc|ppt|pptx' , progress: function (n, elem, res, index) { loadindex = layer.load(2); n = n < 100 ? n : 99; var percent = n + '%' //获取进度百分比 element.progress('step', percent); //可配合 layui 进度条元素使用 $("#progressStep").text(percent) $(".filebox").addClass("uploading"); } , done: function (res) { console.log(res); let percent = "100%"; if (res.code != 1) { percent = "0%"; } element.progress('step', percent); $("#progressStep").text(percent) $(".filebox").removeClass("uploading"); if (res.code != 1) { layer.msg(res.msg); return false; } let url = res.data.fullurl; let src = url; if (url.split(".png").length == 1 && url.split(".jpg").length == 1) { src = "/assets/addons/cms/obj/images/file.png"; } $(".file-input").val(url); $(".filebox .imgbox img").attr("src", src); $(".filebox .imgbox a").attr("href", url); $(".filebox").addClass("uploadok").removeClass("uploading"); layer.close(loadindex) } , error: function (res) { layer.msg("error"); layer.msg(res); } }); $(".fileClose").click(function () { $(".file-input").val(""); $(".filebox").removeClass("uploadok"); }) form.on("submit(" + name + ")", function (data) { let params = data.field; if (params.file) { params["row[file]"] = params.file; delete params.file; } loadindex = layer.load(2); $.post("/addons/cms/diyform/post", params, function (res) { layer.close(loadindex); if (res.code == 1) { layer.closeAll() location.href = '/thanks' // layer.alert(res.msg, { title: false, closeBtn: false, skin: "popup-layer" }, function () { // }); } else { layer.msg(res.msg) $("input[name=__token__").val(res.data.__token__) } }) }) }) } function httpUrl(url, method, params, async, joinUrl) { var result = { 'code': '0', 'msg': '请求错误' }; $.ajax({ type: method, async: Boolean(async), headers: { "token": localStorage.getItem("token"), "jigou": localStorage.getItem("jigou") }, data: params, url: url, dataType: "json", success: function (res) { if (res.code == 401) { location.href = '/login.html'; } else { result = res; } console.log(url); console.log(res); }, error: function () { console.log(params) }, }); return result; } function httpUrll(url, method = 'POST', params, async = true) { return new Promise((resolve, reject) => { $.ajax({ type: method, async: Boolean(async), headers: {}, data: params, url: url, dataType: "json", success: function (res) { // console.log(res); resolve(res); }, error: function (xhr, status, error) { console.error("AJAX Error:", error); console.log(error); reject({ code: xhr.status, msg: xhr.statusText, xhr: xhr, status: status, error: error }); } }); }); } $(function () { if ($('.videosbox')) { $(".videosbox").each(function () { let obj = $(this); let videoJq = $(this).find("video"); let video = videoJq[0]; $(this).find(".icplay").click(function () { if (!videoJq.attr("src")) { video.src = videoJq.attr("url"); } video.play() obj.addClass("play").removeClass("pause"); }) // video.addEventListener('pause', function () { // obj.removeClass("play").addClass("pause"); // }); }) } if ($('.swiper_partner')) { $('.swiper_partner').each(function () { let speed = Number($(this).attr("speed")); var mySwiper = new Swiper($(this), { loop: true, slidesPerView: 'auto', speed, freeMode: true, autoplayDisableOnInteraction: false, noSwiping: true, noSwipingClass: 'swiper-slide', autoplay: { delay: 0, stopOnLastSlide: false, disableOnInteraction: false, }, }) }) } var mySwiper = new Swiper('.swiper_product_sub', { loop: true, autoplay: true, pagination: { el: '.swiper-pagination', clickable: true, }, centeredSlides: true, navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev', }, }) $(function () { var mySwiper = new Swiper('.news-rec', { loop: true, autoplay: true, pagination: { el: '.swiper-pagination', clickable: true, }, }) }) var swiper = new Swiper('.swiper_news', { slidesPerView: 1, spaceBetween: 14, observer: true, //开启动态检查器,监测swiper和slide observeParents: true, //监测Swiper 的祖/父元素 breakpointsInverse: true, pagination: { el: '.swiper-pagination', clickable: true, }, breakpoints: { //当宽度大于等于640 640: { slidesPerView: 2, spaceBetween: 14 }, 992: { slidesPerView: 3, spaceBetween: 20 }, 1360: { slidesPerView: 4, spaceBetween: 27 } } }) var swiper = new Swiper('.swiper_application', { slidesPerView: 1, spaceBetween: 10, loop:true, observer: true, //开启动态检查器,监测swiper和slide observeParents: true, //监测Swiper 的祖/父元素 breakpointsInverse: true, pagination: { el: '.swiper-pagination', clickable: true, }, navigation: { nextEl: '.solubox-product .swiper-button-next', prevEl: '.solubox-product .swiper-button-prev', }, breakpoints: { //当宽度大于等于640 640: { slidesPerView: 2, }, 992: { slidesPerView: 3, spaceBetween: 20 }, 1360: { slidesPerView: 3, spaceBetween: 38 }, } }) }) $(function () { if ($('.swiper-center').length) { var currentSwiper = new Swiper('.swiper-center', { loop: true, spaceBetween: 0, }); currentSwiper.$el.parent().find('.swiper-button-next').on('click', function () { currentSwiper.slideNext(); }) currentSwiper.$el.parent().find('.swiper-button-prev').on('click', function () { currentSwiper.slidePrev(); }) var leftSwiper = new Swiper('.swiper-left', { loop: true, spaceBetween: 0, simulateTouch: false, }); var rightSwiper = new Swiper('.swiper-right', { loop: true, spaceBetween: 0, simulateTouch: false, }); currentSwiper.controller.control = [leftSwiper, rightSwiper]; } }) //获取网页参数 function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象 var r = window.location.search.substr(1).match(reg); //匹配目标参数 //解决办法:将解码方式unscape换为decodeURI //原因:浏览器会将url中的中文参数进行encodeURI编码,所以要通过js使用decodeURI进行解码 if (r != null) return decodeURI(r[2]); return null; //返回参数值 } function getUrlParamByStr(str, name) { var index = str.indexOf("?"); str = str.slice(index); var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象 var r = str.substr(1).match(reg); //匹配目标参数 //解决办法:将解码方式unscape换为decodeURI //原因:浏览器会将url中的中文参数进行encodeURI编码,所以要通过js使用decodeURI进行解码 if (r != null) return decodeURI(r[2]); return null; //返回参数值 } var Cookie = { get: function (name) { var value = "; " + document.cookie; var parts = value.split("; " + name + "="); if (parts.length == 2) return parts.pop().split(";").shift(); } }; $(function () { if ($("main#success").length) { let id = localStorage.getItem("download_id"); if (id && id > 0) { $("#success").html(`

提交成功

您的信息已成功接收,请前往手册下载

`); $("head").append(` `) localStorage.removeItem("download_id"); let ret = httpUrl("/api/index/get_download_file", "post", { id }) if (ret.code == 1) { window.parent.location = ret.data.file; } } else { $("#success").html(`

感谢您的联系

您的信息已成功接收。我们将尽快给您回复。

`); } } }) // selector $(function () { function buildSelectorQiyuConsult() { function toAbsoluteUrl(url) { if (!url || url === 'javascript:;') return ''; try { return new URL(url, window.location.origin).href; } catch (e) { return url; } } function getUid() { const key = 'selector_qiyu_uid'; let uid = localStorage.getItem(key); if (!uid) { uid = 'visitor_' + Date.now() + '_' + Math.random().toString(16).slice(2); localStorage.setItem(key, uid); } return uid; } function getProductFromCard($card) { return { id: String($card.data('consult-id') || ''), title: String($card.data('consult-title') || ''), image: toAbsoluteUrl(String($card.data('consult-image') || '')), desc: String($card.data('consult-desc') || ''), url: toAbsoluteUrl(String($card.data('consult-url') || '')) }; } function showLoadingMessage() { if (window.layer && layer.msg) { layer.msg('客服加载中,请稍后再试'); } else { alert('客服加载中,请稍后再试'); } } function open(product) { if (!window.selectorQiyuReady || !window.ysf) { showLoadingMessage(); return; } try { product = product || {}; const productUrl = product.url || window.location.href; const productImage = product.image || ''; const data = [ { index: 0, key: 'product_id', label: '产品ID', value: product.id || '' }, { index: 1, key: 'product_title', label: '产品名称', value: product.title || '', href: productUrl }, { index: 2, key: 'product_category', label: '产品分类', value: product.desc || '' }, { index: 3, key: 'product_tag', label: '产品标签', value: product.tag || '' }, { index: 4, key: 'product_url', label: '产品链接', value: productUrl, href: productUrl }, { index: 5, key: 'product_image', label: '产品图片', value: productImage, href: productImage }, { index: 6, key: 'from_url', label: '来源页面', value: window.location.href, href: window.location.href } ]; ysf('config', { uid: getUid(), name: product.title ? '咨询:' + product.title : '产品咨询访客', data: JSON.stringify(data), groupid: 480467068, success: function () { // config成功后设置商品卡片 ysf('product', { show: 1, title: product.title || '', desc: product.desc || '', picture: productImage, url: productUrl }); // 打开客服窗口 ysf('open'); } }); } catch (e) { showLoadingMessage(); } } function bind(container, cardSelector, triggerSelector) { $(container).on('click', '.js-qiyu-consult', function (e) { e.preventDefault(); const $card = $(this).closest(cardSelector); // console.log(getProductFromCard($(this))); open(getProductFromCard($(this))); }); } return { toAbsoluteUrl: toAbsoluteUrl, getProductFromCard: getProductFromCard, open: open, bind: bind }; } window.selectorQiyuConsult = window.selectorQiyuConsult || buildSelectorQiyuConsult(); if ($("#selector-main").length) { // 筛选器管理器 - 统一管理状态和UI class FilterManager { constructor(options) { this.options = options; this.state = this.getDefaultState(); this.isSyncing = false; this.currentRequest = null; this.sliders = {}; this.init(); } // 默认状态 getDefaultState() { let json = getPageDefaultState(); return { ...json }; } // 初始化 init() { this.iconTip(); this.initSliders(); this.bindEvents(); this.loadInitialState(); this.render(); } // 初始化滑块 initSliders() { this.initSlider('price', '#sliderPrice', { min: parseFloat($('#sliderPrice').data('min') || 0), max: parseFloat($('#sliderPrice').data('max') || 40), step: 1 }); this.initSlider('scansize', '#sliderSize', { min: parseFloat($('#sliderSize').data('min') || 0), // 微型(1cm及以下) max: parseFloat($('#sliderSize').data('max') || 1000), //超大型(10m及以上) step: 1 }); } iconTip() { $(".iconTip").on("click", function (e) { e.preventDefault(); layer.closeAll('tips'); let txt = $(this).data("txt"); layer.tips(txt, this, { tips: 1, time: 6000 }); }) $(document).on("click", function (e) { let isTip = $(e.target).hasClass("iconTip"); if (!isTip) { layer.closeAll('tips'); } }) } initSlider(name, selector, config) { const element = document.querySelector(selector); if (!element) return; noUiSlider.create(element, { connect: true, step: config.step, start: [config.min, config.max], range: { min: config.min, max: config.max } }); this.sliders[name] = element; const defaultState = this.getDefaultState(); // 更新显示 element.noUiSlider.on('update', (values) => { // console.log(`.js-${name}-min`,values); let max = this.formatValue(values[1]); $(`.js-${name}-min`).text(this.formatValue(values[0])); $(`.js-${name}-max`).text(max); let maxUnit = $(`.js-${name}-unit`); let maxUnitText = maxUnit.data('unit'); if (max && max == defaultState[name + '_max']) { maxUnitText += "+"; } maxUnit.text(maxUnitText); }); // 值改变时重新加载 element.noUiSlider.on('set', () => { if (!this.isSyncing) this.reload(); }); } formatValue(value) { return parseFloat(value).toFixed(3).replace(/\.?0+$/, ''); } // 手机端折叠 mobileToggle() { $(".filter-group").removeClass('toggle open'); if ($(window).width() >= 1024) { return; } $(".filter-group").each(function () { if ($(this).find(".inner").length) { let groupWidth = $(this).find(".group-content").width(); let inner = $(this).find(".inner")[0]; if (inner.scrollWidth > groupWidth) { $(this).addClass('toggle'); } } }) } // 绑定事件 bindEvents() { this.mobileToggle(); $(window).off('resize.filterSelector').on('resize.filterSelector', () => { this.mobileToggle(); }); // 筛选项改变 $('.filter-sidebar').off('click.filterSelectorMobile', '.js-toggle-mobile').on('click.filterSelectorMobile', '.js-toggle-mobile', function () { $(this).closest(".filter-group").toggleClass("open"); }); $('.filter-sidebar').on('change', '.js-filter-option', (e) => { if (this.isSyncing) return; const $target = $(e.target); $target.closest('label').toggleClass('active', $target.is(':checked')); this.reload(); }); // 筛选折叠 $('.js-toggle-group').on('click', function () { var $group = $(this).closest('.filter-group'); $group.find('.group-content').slideToggle(); $(this).find('i').toggleClass('layui-icon-up layui-icon-down'); }); // 搜索按钮 $('.search-btn').on('click', () => this.reload()); // 鼠标离开(失去焦点) $('.search-input').on('blur', () => this.reload()); // 清空所有筛选 $('.js-clear-all').on('click', () => this.clearAll()); // 分页点击 $('.page-selector-pagination').on('click', 'a', (e) => { e.preventDefault(); const page = this.getPageFromUrl($(e.target).attr('href')); this.loadPage(page); $(window).scrollTop(0); }); // 浏览器前进后退 window.addEventListener('popstate', () => { this.setStateFromUrl(window.location.href); this.load(); }); } // 获取UI状态 getStateFromUI() { const state = { ...this.getDefaultState() }; // const state = getPageDefaultState(); // 获取滑块值 if (this.sliders.price) { const values = this.sliders.price.noUiSlider.get(); let min = Math.round(values[0]) * 1; let max = Math.round(values[1]) * 1; state.price_min = min != state.price_min ? min : ''; state.price_max = max != state.price_max ? max : ''; } // console.log("state22:",state); if (this.sliders.scansize) { const values = this.sliders.scansize.noUiSlider.get(); let min = this.formatValue(values[0]); let max = this.formatValue(values[1]); state.scansize_min = min != state.scansize_min ? min : ''; state.scansize_max = max != state.scansize_max ? max : ''; } // 获取复选框值 $('.js-filter-option:checked').each((_, el) => { const $el = $(el); const field = $el.data('field'); // console.log("field:",field); // console.log(state[field]); if (state[field]) state[field].push(String($el.val())); }); // 获取关键词 let keywords = $('.search-input').val(); if (keywords && keywords != '') { state.keywords = keywords; } return state; } // 应用状态到UI applyStateToUI(state) { this.isSyncing = true; let defaultState = this.getDefaultState(); // 设置滑块 if (this.sliders.price && state.price_min && state.price_max) { this.sliders.price.noUiSlider.set([state.price_min, state.price_max]); if (state.price_max && state.price_max == defaultState.price_max) { $(".js-price-unit").text("+"); } else { $(".js-price-unit").text(""); } } if (this.sliders.scansize && state.scansize_min && state.scansize_max) { this.sliders.scansize.noUiSlider.set([state.scansize_min, state.scansize_max]); } // 设置复选框 $('.js-filter-option').each((_, el) => { const $el = $(el); const field = $el.data('field'); const values = state[field] || []; const checked = values.includes(String($el.val())); $el.prop('checked', checked); $el.closest('label').toggleClass('active', checked); }); $('.search-input').val(state.keywords); this.isSyncing = false; } // 构建API URL buildApiUrl(page) { const params = this.buildParams(this.state); params.pageurl = location.pathname; if (page) params.page = page; const queryString = new URLSearchParams(params).toString(); return `/api/selector/index${queryString ? '?' + queryString : ''}`; } // 构建浏览器URL buildBrowserUrl() { const params = this.buildParams(this.state); if (Object.keys(params).length === 0) return this.getBasePath(); const queryString = new URLSearchParams(params).toString(); return `${this.getBasePath()}?${queryString}`; } buildParams(state) { let json = this.getDefaultState(); const params = {}; for (let key in json) { let value = state[key]; if (value && value != '') { let sub = key.substr(-4); if (['_min', '_max'].includes(sub)) { let price_min = state.price_min; let price_max = state.price_max; let scansize_min = state.scansize_min; let scansize_max = state.scansize_max; if (price_min != '' && price_min && price_min != '' && price_min !== json.price_min) params.price_min = price_min; if (price_max != '' && price_max !== json.price_max) params.price_max = price_max; if (scansize_min != '' && scansize_min !== json.scansize_min) params.scansize_min = scansize_min; if (scansize_max != '' && scansize_max !== json.scansize_max) params.scansize_max = scansize_max; } else if (Array.isArray(value)) { params[key] = value.join(','); } else { params[key] = value; } } }; return params; } // 从URL解析状态 getStateFromUrl(url) { const parsedUrl = new URL(url, window.location.origin); const state = this.getDefaultState(); // state.price_min = parsedUrl.searchParams.get('price_min') || state.price_min; // state.price_max = parsedUrl.searchParams.get('price_max') || state.price_max; // state.scansize_min = parsedUrl.searchParams.get('scansize_min') || state.scansize_min; // state.scansize_max = parsedUrl.searchParams.get('scansize_max') || state.scansize_max; // state.keyword = parsedUrl.searchParams.get('keyword') || ''; // ['channel_ids', 'styles', 'color_scan', 'scan_file_type'].forEach(field => { // const value = parsedUrl.searchParams.get(field); // if (value) state[field] = value.split(','); // }); for (let key in state) { const value = parsedUrl.searchParams.get(key); if (value && value != '') { if (Array.isArray(value)) { state[key] = value.split(','); } else { state[key] = value; } } }; return state; } // 加载数据 async load(page = null) { // 取消正在进行的请求 if (this.currentRequest && this.currentRequest.readyState !== 4) { this.currentRequest.abort(); } const apiUrl = this.buildApiUrl(page || this.getPageFromUrl()); let that = this; layui.use("layer", function () { var layer = layui.layer; var loadindex = layer.load(2); that.currentRequest = $.ajax({ url: apiUrl, type: 'GET', dataType: 'json', headers: { 'X-Requested-With': 'XMLHttpRequest' }, success: (res) => { if (res && res.code === 1 && res.data) { that.updateDOM(res.data); // that.state = res.data.filter_state || that.getStateFromUI(); that.state = that.getStateFromUI(); that.applyStateToUI(that.state); // 更新浏览器历史 const browserUrl = that.buildBrowserUrl(); history.pushState({ url: apiUrl }, '', browserUrl); } }, complete: () => { layer.close(loadindex); } }); }) } // 重载当前页 reload() { this.state = this.getStateFromUI(); this.load(); } // 加载指定页 loadPage(page) { this.state = this.getStateFromUI(); this.load(page); } // 清空所有筛选 clearAll() { this.state = this.getDefaultState(); this.applyStateToUI(this.state); this.load(); } // 更新DOM updateDOM(data) { $('#proGroup').html(data.html || ''); $('.page-selector-pagination').html(data.pagination || ''); $(document).trigger('selector:products-updated'); } // 获取基础路径 getBasePath() { return window.location.pathname.replace(/\/\d+\/?$/, '/').replace(/\/+$/, '/'); } // 从URL获取页码 getPageFromUrl(url = window.location.href) { const parsedUrl = new URL(url, window.location.origin); return parsedUrl.searchParams.get('page') || ''; } // 加载初始状态 loadInitialState() { this.state = this.getStateFromUrl(window.location.href); this.applyStateToUI(this.state); } // 渲染(对外接口) render() { this.load(); } } // 对比管理器 - 管理产品对比功能 class CompareManager { constructor(storageKey = 'cms_selector_compare_items') { this.storageKey = storageKey; this.maxItems = 4; this.init(); } init() { this.bindEvents(); this.render(); localStorage.removeItem(this.storageKey); // 清空历史对比数据 } bindEvents() { // 添加对比 $('#proGroup').on('click', '.js-compare-toggle', (e) => { e.preventDefault(); const $btn = $(e.target).closest('.js-compare-toggle'); if ($btn.hasClass('added')) return; const items = this.getItems(); if (items.length >= this.maxItems) { return layer.msg(`最多只能对比${this.maxItems}个产品`); } const $card = $btn.closest('.product-card'); const item = this.getItemFromCard($card); this.addItem(item); this.syncProductButtons(); }); window.selectorQiyuConsult.bind('#proGroup', '.product-card'); // 移除对比 $('.js-compare-items').on('click', '.js-compare-remove', (e) => { e.preventDefault(); const id = $(e.target).data('compare-id'); this.removeItem(id); this.syncProductButtons(); }); // 清空对比 $('.js-clear-compare').on('click', (e) => { e.preventDefault(); this.clear(); }); // 开始对比 $('.js-start-compare').on('click', (e) => { e.preventDefault(); const $btn = $(e.target); if ($btn.hasClass('disabled')) return; const ids = this.getItems().map(item => item.id).filter(Boolean); if (ids.length === 0) return; const compareUrl = $btn.data('url') + '?ids=' + encodeURIComponent(ids.join(',')); window.location.href = compareUrl; }); $(document).on('selector:products-updated', () => { this.syncProductButtons(); }); } getItems() { try { const raw = localStorage.getItem(this.storageKey); const items = raw ? JSON.parse(raw) : []; return Array.isArray(items) ? items : []; } catch (e) { return []; } } setItems(items) { localStorage.setItem(this.storageKey, JSON.stringify(items.slice(0, this.maxItems))); this.render(); } addItem(item) { if (!item.id) return; let items = this.getItems(); items = items.filter(i => String(i.id) !== String(item.id)); items.push(item); this.setItems(items); this.renderItemAdded(item); } removeItem(id) { const items = this.getItems().filter(item => String(item.id) !== String(id)); this.setItems(items); this.renderItemRemoved(id); } clear() { this.setItems([]); this.renderClear(); } getItemFromCard($card) { return { id: String($card.data('compare-id') || ''), title: String($card.data('compare-title') || ''), image: String($card.data('compare-image') || ''), desc: String($card.data('compare-desc') || '') }; } render() { const items = this.getItems(); const count = items.length; $("#compareSite").toggle(count > 0); $(".js-start-compare").toggleClass('disabled', count <= 1); $('.js-selected-count').text(count); // 渲染对比栏 const container = $(".compare-items"); container.empty(); for (let i = 0; i < this.maxItems; i++) { const item = items[i]; const html = item ? this.renderItemHtml(item) : `
  • 产品${i + 1}
  • `; container.append(html); } this.syncProductButtons(); } syncProductButtons() { const selectedIds = this.getItems().map(item => String(item.id)); $('.js-compare-toggle').each(function () { const $btn = $(this); const id = String($btn.data('compare-id') || ''); if (selectedIds.includes(id)) { $btn.html('已加入').addClass('added'); } else { $btn.html(' 对比').removeClass('added'); } }); } renderItemHtml(item) { return `
  • ${item.title}
    ${item.title}
    ${item.desc}
  • `; } renderItemAdded(item) { // 可选的添加动画或提示 } renderItemRemoved(id) { // 可选的移除动画或提示 } renderClear() { $(".js-selected-count").text("0"); this.syncProductButtons(); } } // 初始化 $(function () { const filterManager = new FilterManager(); const compareManager = new CompareManager(); }); } if ($("#selector-comapare-main").length) { window.selectorQiyuConsult.bind('#selector-comapare-main', '.compare-col', '.product-actions .btn-more'); // 同步每一列里同位置 .align 的高度,保证对比表格在响应式下也能对齐。 function syncCompareAlignHeight() { var $cols = $('.compare-col'); if (!$cols.length) { return; } // 先恢复自然高度,避免多次计算叠加。 $('.compare-col .align').css('height', 'auto'); // 以第一列的 .align 数量作为基准,逐行取最大值。 var rowCount = $cols.eq(0).find('.align').length; for (var i = 0; i < rowCount; i++) { var maxHeight = 0; var $items = $(); $cols.each(function () { var $cell = $(this).find('.align').eq(i); if ($cell.length) { $items = $items.add($cell); } }); $items.each(function () { var height = $(this).outerHeight(); if (height > maxHeight) { maxHeight = height; } }); if (maxHeight > 0) { $items.css('height', maxHeight + 'px'); } } } // 简单防抖,避免 resize 触发过密。 var syncAlignTimer = null; function scheduleSyncCompareAlignHeight() { clearTimeout(syncAlignTimer); syncAlignTimer = setTimeout(syncCompareAlignHeight, 80); } layui.use(['layer', 'form'], function () { var layer = layui.layer; var form = layui.form; $("#showLayer").on("click", function () { layer.open({ type: 1, closeBtn: false, title: false, content: $("#compareLayer"), maxWidth: 1200, skin: "compare-layer", success: function (layeo, index) { layeo.find(".closeBtn").on("click", function () { layer.close(index) }) getList() } }) }) form.on("select(select)", function (e) { let value = e.value; $(".layer-product-card").each(function () { if ($(this).data("cid") == value || !value) { $(this).show(); } else { $(this).hide(); } }) }) function getList(id) { $("#compareBody").empty(); $.ajax({ type: "post", async: false, data: { channel_id: id, arcids: getUrlIds() }, url: "/api/selector/ajaxChannelList", dataType: "json", success: function (res) { if (res.code == 1) { $("#compareBody").html(res.data.html); } else { console.err(res.data.msg) } }, error: function (e) { console.err(e.data.msg) }, }); } function getUrlIds() { let ids = new URLSearchParams(location.search).get("ids"); let idsarr = ids ? ids.split(",") : []; return idsarr; } $(document).on("click", ".layer-product-card", function () { let id = $(this).data("compare-id"); layer.closeAll(); let ids = getUrlIds(); ids.push(id); location.href = location.pathname + "?ids=" + ids.join(",") }) $(".close-btn").on("click", function () { let id = $(this).data("compare-id"); let ids = getUrlIds(); if (ids.length <= 2) { return layer.msg("最少保留两个!"); } let newIds = ids.filter(n => n != id) location.href = location.pathname + "?ids=" + newIds.join(",") }) }); // 隐藏相同项交互逻辑 $('.js-hide-same').on('change', function () { var isHide = $(this).is(':checked'); if (!isHide) { $('.param-row').slideDown(200) } else { var rowCount = $('.compare-col').eq(0).find(".param-row").length; for (var i = 0; i < rowCount; i++) { let arr = $(".compare-col-data .param-row[data-index=" + i + "]").map(function () { return $(this).data("value"); }); let flag = arr.filter((key, item) => item != arr[0]).length; if (!flag) { console.log(i); $(".param-row[data-index=" + i + "]").slideUp(200); } } } scheduleSyncCompareAlignHeight(); }); // 页面首次渲染、图片加载完成、窗口尺寸变化后都重新对齐一次。 $(window).on('load resize', function () { scheduleSyncCompareAlignHeight(); }); setTimeout(scheduleSyncCompareAlignHeight, 0); } })