байх хэрэгцээг ойлгоно. Энэ нь мөн аф...">
,需要通过父级DOM结构来判断
*/
var trackActionPhone = function (node) {
var nodeInnerText = node.innerText || '';
if (!limitRegLength(nodeInnerText)) return;
var nodeText = trimText(nodeInnerText);
if (nodeText.length < 5 || nodeText.length > 20) return false;
var type =
arguments.length > 1 && arguments[1] !== undefined
? arguments[1]
: 'click';
var str = trimText(node.href || node.innerHTML || '');
if (phoneReg.test(str) && numUseReg.test(str)) {
_paq.push(['trackEvent', type, 'phone', nodeText]);
return true;
}
/** 排查父级嵌套非标签场景,并且对dom的正则校验做一个性能兜底,通过控制innerText的长度,来确保正则的性能 */
var fatherText = trimText(node.parentNode.innerText || '');
if (fatherText.length < 5 || fatherText.length > 20) return false;
var fatherDom = trimText(node.parentNode.innerHTML || '');
if (phoneReg.test(fatherDom) && numUseReg.test(fatherDom)) {
_paq.push(['trackEvent', type, 'phone', nodeText]);
return true;
}
return false;
};
window.addEventListener('click', function (e) {
var node = e.target;
/** 社媒点击 */
var appName = '';
var getAppAriaLabel =
node.ariaLabel || node.parentNode.ariaLabel || '';
if (mediaList.includes(getAppAriaLabel.toLowerCase())) {
appName = getAppAriaLabel;
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'a'
) {
appName = getMediaName(node.href) || getMediaName(node.alt);
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'img'
) {
appName = getMediaName(node.alt) || getMediaName(node.src);
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'i'
) {
appName = getMediaName(node.className);
}
if (appName) {
_paq.push(['trackEvent', 'click', 'contactApp', appName]);
return;
}
/** 联系方式点击 */
if (trackActionPhone(node, 'click')) return;
if (node.nodeName && node.nodeName.toLowerCase() === 'a') {
var val = node.href;
if (!limitRegLength(val)) return;
if (emailReg.test(val)) {
_paq.push(['trackEvent', 'click', 'email', val]);
return;
}
}
if (node.nodeName && node.nodeName.toLowerCase() === 'i') {
var val = node.className;
var content = node.parentNode.href || '';
if (val.includes('email')) {
_paq.push(['trackEvent', 'click', 'email', content]);
return;
}
}
var nodeChildList = node.childNodes;
for (var i = 0; i < nodeChildList.length; i++) {
if (nodeChildList[i].nodeType !== 3) continue;
var val = nodeChildList[i].textContent.replace(/\s?:?/g, '');
if (!limitRegLength(val)) continue;
if (emailReg.test(val)) {
_paq.push(['trackEvent', 'click', 'email', val]);
return;
}
}
trackNumberData(node);
});
window.addEventListener('copy', function (e) {
if (trackActionPhone(e.target, 'copy')) return;
var text = e.target.textContent;
if (!text) return;
var val = text.replace(/\s:?/g, '');
if (!limitRegLength(val)) return;
if (emailReg.test(val)) {
_paq.push(['trackEvent', 'copy', 'email', val]);
return;
}
trackNumberData(e.target);
});
}
trackContactInit();
/**
* 基于custom_inquiry_form.js 以及 form.js 对于询盘表单提交的实现,来反推询盘表单的input标签触发,用来收集意向客户
* 1. 缓存的KEY:TRACK_INPUT_ID_MTM_00;
* 2. 缓存策略 - lockTrackInput:单个页面内,10分钟内,不重复上报
*/
function trackActionInput() {
const CACHE_KEY = 'TRACK_INPUT_ID_MTM_00';
const pathName = window.location.hostname + window.location.pathname;
var lockTrackInput = function () {
try {
const lastCacheData = localStorage.getItem(CACHE_KEY);
if (!lastCacheData) return false;
const cacheData = JSON.parse(lastCacheData);
const cacheTime = cacheData[pathName];
if (!cacheTime) return false;
return Date.now() - cacheTime < 1000 * 60 * 10; // 10分钟内,不重复上报
} catch (error) {
console.error('lockTrackInput Error', error);
return false;
}
};
var setInputTrackId = function () {
try {
const curCacheData = localStorage.getItem(CACHE_KEY);
if (curCacheData) {
const cacheData = JSON.parse(curCacheData);
cacheData[pathName] = Date.now();
localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData));
return;
}
const cacheData = {
[pathName]: Date.now(),
};
localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData));
} catch (error) {
console.error('setInputTrackId Error', error);
}
};
var getInputDom = function (initDom) {
var ele = initDom;
while (ele) {
/**
* isWebSiteForm 是站点的表单
* isChatWindowForm 是聊天窗口的表单
*/
/** 旧模板表单 */
var isWebSiteForm = !!(
/crm-form/i.test(ele.className) && ele.querySelector('form')
);
/** 1:新模板自定义表单、2:Get a Quote 弹框表单 */
var isWebSiteFormNew = !!(
/inquiry/i.test(ele.className) && ele.querySelector('form')
);
if (isWebSiteForm || isWebSiteFormNew) {
_paq.push(['trackEvent', 'formInquiry', 'formInput', 'page']);
setInputTrackId();
return;
}
/** Mkt会话触达-聊天弹框的表单输入: MKT由于是iframe嵌入,所以MKT的上报,会单独写到MKT-form代码上 */
var isInquiryChatForm = !!(
/comp-form/i.test(ele.className) && ele.querySelector('form')
);
if (isInquiryChatForm) {
_paq.push(['trackEvent', 'formInquiry', 'formInput', 'chat']);
setInputTrackId();
return;
}
/** 向上查找父节点 */
ele = ele.parentNode;
}
};
function initInputListener() {
var inputUseDebounce = function (fn, delay) {
var timer = null;
var that = this;
return function () {
var args = Array.prototype.slice.call(arguments);
if (timer) clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(that, args);
}, delay);
};
};
var optimizeGetInputDom = inputUseDebounce(getInputDom, 300);
window.addEventListener('input', function (e) {
/** 如果已经上报过,则不再上报 */
if (lockTrackInput()) return;
optimizeGetInputDom(e.target);
});
}
try {
initInputListener();
} catch (error) {
console.log('initInputListener Error', error);
}
}
trackActionInput();
}
/** 第三方消息上报:目前主要是针对全点托管会话;在msgCollect/index.js中调试,访问test.html */
function thirdMsgCollect() {
/** 先检测是否是stayReal托管:如果stayReal脚本都没有,那么说明当前站点未开启stayReal会话托管 */
const scriptList = Array.prototype.slice.call(
document.querySelectorAll('script'),
);
const checkStayReal = () =>
!!scriptList.find((s) => s.src.includes('stayreal.xiaoman.cn'));
if (!checkStayReal()) return;
/** 缓存当前消息队列的最后一条消息id */
const CACHE_KEY = 'CACHE_KEY_MONITOR';
const setCache = (msgIndex) => {
/** 对缓存KEY进行base64转码处理 */
const cacheMsgIndex = btoa(msgIndex);
localStorage.setItem(CACHE_KEY, cacheMsgIndex);
};
const getCache = () => {
const cacheMsgIndex = localStorage.getItem(CACHE_KEY);
if (cacheMsgIndex) return Number(atob(cacheMsgIndex));
return -1;
};
/** 拉取最新msg列表 */
const pullMsgList = () => {
const msgEleList = Array.prototype.slice.call(
document.querySelectorAll('#chat-list li'),
);
const msgIds = [];
const msgMap = msgEleList.reduce((acc, item) => {
const sendTime = item
.querySelector('.message-data-time')
.textContent.trim();
const sendContent = item.querySelector('.message').textContent.trim();
/** msg带有class:other-message的是访客消息,my-message的是客服消息 */
const isOtherMessage = item
.querySelector('.message')
.classList.contains('other-message');
const msgId = item.querySelector('.message').getAttribute('id');
const msgItemData = {
msgId,
user: isOtherMessage ? 'visitor' : 'official',
time: sendTime,
content: sendContent,
};
msgIds.push(msgId);
acc[msgId] = msgItemData;
return acc;
}, {});
return {
ids: msgIds,
dataMap: msgMap,
};
};
/** 加密并上传消息数据 */
let ENCRYPT_KEY = 'de29f1aab63ab033';
let ENCRYPT_IV = 'b8d2badf875e76ac';
const baseUrl = 'https://cms.xiaoman.cn';
// var getEncryptConfig = function () {
// const url = baseUrl + '/shop-api/innerApi/getKeyIv'
// $.get(
// url,
// function (result) {
// console.log('result', result)
// if (Number(result.code) === 0 && result.data.key && result.data.iv) {
// ENCRYPT_KEY = result.data.key
// ENCRYPT_IV = result.data.iv
// uploadMsgData()
// } else {
// /** 如果获取失败,则重试 */
// setTimeout(() => {
// getEncryptConfig()
// }, 1000)
// }
// },
// 'json'
// )
// }
// getEncryptConfig()
const encryptMsg = function (msgData) {
const enc = new TextEncoder();
// 转字节
const keyBytes = enc.encode(ENCRYPT_KEY);
const ivBytes = enc.encode(ENCRYPT_IV);
const plainBytes = enc.encode(msgData);
// 导入密钥并加密
return crypto.subtle
.importKey('raw', keyBytes, { name: 'AES-CBC' }, false, ['encrypt'])
.then(function (cryptoKey) {
return crypto.subtle.encrypt(
{ name: 'AES-CBC', iv: ivBytes },
cryptoKey,
plainBytes,
);
})
.then(function (encryptedBuffer) {
// 转 base64 返回
return btoa(
String.fromCharCode(...new Uint8Array(encryptedBuffer)),
);
})
.catch((err) => {
return Promise.reject(err);
});
};
let uploadFlag = false;
const uploadMsgData = function () {
if (uploadFlag) return;
uploadFlag = true;
const { ids, dataMap } = pullMsgList();
let cacheMsgIndex = getCache();
const msgLen = ids.length;
if (!msgLen) {
// 消息DOM未挂载 || 消息DOM已挂载,但是消息列表为空
uploadFlag = false;
return;
}
if (msgLen - 1 < cacheMsgIndex) {
/** 针对站点挂后台一段时间,消息列表会自动塞入重复消息,导致消息有重复,刷新后又重置回正常消息列表,所以这里需要更新锚点下标 */
cacheMsgIndex = msgLen - 1;
setCache(cacheMsgIndex);
uploadFlag = false;
return;
}
if (msgLen - 1 === cacheMsgIndex) {
// 缓存的最后一次发送的消息ID是最后一条(说明当前消息均已经上报),则不跳过本地上报
uploadFlag = false;
return;
}
const currentMsgIds = ids.slice(cacheMsgIndex + 1, msgLen);
const currentMsgData = currentMsgIds.map((id) => dataMap[id]);
const mtmId = window.matomo_site_id_cookie_key || ''; // 获取mtm会话id
const msgBody = {
mtmId,
curl: window.location.href,
msgList: currentMsgData,
};
const msgBodyStr = JSON.stringify(msgBody);
encryptMsg(msgBodyStr)
.then(function (encryptedMsg) {
console.log('encryptedMsg:', encryptedMsg, msgBodyStr);
const url = baseUrl + '/shop-api/External/ListenSiteActiveStatus';
$.ajax({
type: 'POST',
url,
data: JSON.stringify({ d_v: encryptedMsg }),
contentType: 'application/json',
success: function (result) {
if (Number(result.code) === 0) {
// 更新消息队列
setCache(msgLen - 1);
}
uploadFlag = false;
},
error: function (err) {
console.error(err, '请求异常');
uploadFlag = false;
},
});
})
.catch((err) => {
console.error(err, '数据加密失败');
uploadFlag = false;
});
};
/** 监控chat-list的DOM变更 */
const initChatListObserver = () => {
// 需要监听的 DOM 节点
const target = document.getElementById('chat-list');
if (!target) return;
// 回调函数
const callback = function (mutationsList, observer) {
for (const mutation of mutationsList) {
console.log('mutation', mutation);
if (mutation.type === 'childList') {
uploadMsgData();
}
}
};
// 配置
const config = {
childList: true, // 监听子节点的增删
subtree: true, // 是否也监听后代节点
};
// 创建 observer
const observer = new MutationObserver(callback);
// 开始监听
observer.observe(target, config);
};
let testCount = 30;
let itv = null;
const checkChatDom = () => !!document.querySelector('#vc-model');
const initTalkCheck = () => {
itv = setTimeout(() => {
console.log('checkChatDom', checkChatDom(), testCount);
if (!checkChatDom() && testCount > 0) {
testCount--;
initTalkCheck();
return;
}
clearTimeout(itv);
uploadMsgData();
initChatListObserver();
}, 1500);
};
initTalkCheck();
}
try {
gtmTrack();
thirdMsgCollect();
console.log('inserted gtm code');
} catch (error) {
console.error('gtmTrack Error', error);
}
});
})();
CDPH-д бид зөв удирдан мэдэрсэн системийн хэрэгцээг ойлгоно контейнер эмнэлэг . Энэ нь таны зүйлсээ хэр хурдан, үр дүнтэй олох, хадгалахад нөлөөлж болно. Бид таньд биднээс захидалт хийх үед авах боломжтой давуу талуудын жагсаалтыг өргөтгөсөн бөгөөд энд урьдчилан шалгасан контейнерийн хангамжийн үйлдвэрүүд, өндөр чанарын стандартад нийцсэн бүтээгдэхүүнүүд, ашигтай зүйлсийг хянахад тооцоолох хэрэгтэй түгээмэл асуултууд, мөн CDPH-ийн салбаруудад контейнеруудыг зохион байгуулах зэрэг олон төрлийн чанартай контейнерийн дэлгүүрүүдээс опт олбороор хямд үнэтэйгээр авах боломж орно. Таны контейнерийн сангийн сонголтоор CDPH-д хандах үед олон давуу талуудтай болно. Олон төрлийн зориулалтаар ашиглахад тохиромжтой, бидний контейнерүүд хүчтэй, бат бөх бөгөөд хоёр фунтын хэмжээтэй хүртэлх хэмжээтэйгээр байна. Хоол, хувийн зүйлс, хувцас, хэрэгсэл эсвэл үнэт барааны борлуулалттай холбоотой бүтээгдэхүүнүүдийг хадгалах шаардлагатай бол бидний бокторууд эдгээр зүйлсээ элемент болон гэрэлтэй нарангийн нөлөөнөөс хамгаалж, эрхтэй байлгах боломжийг олгоно. Холбоотой бүтээгдэхүүнүүд. Мөн манай сав хэмжээ ихээр олон төрлийн хэмжээтэй ирдэг тул таны шаардлагад нийцэх болно. Өндөр чанартай контейнер эмнэлэг бүтээгдэхүүнийг оптомоор худалдан авах хэрэгтэй хүмүүст зориулан CDPH бүхнээ санал болгодог. Бид үнэ харьцангуй хямд, үргэлж үнэн зөв ашиг олохын тулд үргэлжлэх чадвар сайтай материал ашигладаг. Та дээшлэн тавихад тохиромжтой савнаас эхлээд бараагаа харагдуулахад зориулсан бүрхүүлтэй цонхтой пластик сав хүртэл бүх юмыг авч болно. Танай томоохон хэмжээний савны худалдан авалтын шаардлагыг CDPH-д итгэснээр та бүтээгдэхүүний шилдэг чанарыг авдаг болно. Хотхон зүйлсийг эрхэн зохион байгуулах нь маш үр дүнтэй ч гэсэн хэрэглэгчдийн тулгардаг зарим асуудал байдаг. Бид эдгээр савыг илүүдэл ачаалах дуртай байдаг бөгөөд юмсыг хайж олох, гаргах гэхэд энэ нь маш үр дүнтэй байдаггүй. Та хадгалалтын орон тоог хамгийн сайн ашиглахын тулд шаардлагатай үедээ тогтмол хайрцгуудаа шалгаж, хэрэггүй зүйлсээ цэвэрлэх хэрэгтэй. Түүнчлэн, хэрэв шаардлагатай бол савнууддаа шошго тавиад хайж буй зүйлээ хялбархан олох боломжтой. CDPH-д бидний савны дэлгүүрийн бүтээгдэхүүнүүдийг интернетэд аль ч өөр газарт олдохгүй үнээр санал болгодог. Хэрэв танд өөрийн хэрэгцээнд зориулж хэд хэдэн сав хэрэгтэй эсвэл худалдааны зориулалтаар томоохон хэмжээтэй сав хэрэгтэй бол бидэнд таны хэрэгцээт бүхнээ олж авах боломжтой. Манай жижиглэнгийн үнүүд нь зах зээл дээрх хамгийн бага үнүүдийн нэг юм. Иймээс таны мөнгөнд онцгой өртөг оруулах болно гэдэгт баталгаатай байна. CDPH-д бид танд ямар ч үнээр өртөхгүй өндөр чанартай савны дэлгүүрийн бүтээгдэхүүнүүдийг санал болгоход зорилгоо тавьсан. Урьдчилан бэлтгэсэн байшин нь тусгай бүтээцтэй байгууламжийн загварыг ашигладаг бөгөөд аюулгүй байдлыг хангахын тулд сайн чичирхийллийн тэсвэрт чадалтай байдаг. Модуль загвар нь зөөх, суурилуулахад хялбар бөгөөд контейнер дэлгүүрт таны хувийн сонирхол, стилийн ялгаатай тааламж, өрөөний төрлүүдэд тохируулан зохион байгуулж болно. Бүх элементүүдийг урьдчилан бэлтгэсэн материалуудаас үйлдвэрлэдэг бөгөөд суурилуулахад хялбар бөгөөд тодорхой чадвар шаарддаггүй. Энэ нь ажлын өрөө, оршин суух, хадгалах эсвэл бусад нөхцөл байдалд зориулагдсан эсэхээс үл хамааран урьдчилан бэлтгэсэн байшин таны шаардлагыг хангана. Загварын гадаад харагдац, цэвэр шугамууд нь таны хувийн сонирхолд тохируулан өөрийн гэсэн амьдрах орон зайг бүтээх боломжийг олгоно. Хамгийн сайн тал нь урьдчилан бэлтгэсэн байшингуудыг объект дээр цувилгаанд залгах шаардлагагүй бөгөөд бид суурилуулах зааварчлалыг оруулан өгдөг тул суурилуулах ажил хялбар, хурдан хийгдэнэ. Chengdong-ийн урьдчилан бэлтгэсэн байшингуудын тусламжтайгаар илүү амар амгалан амьдрах амьдралын давуу талуудыг эзэмшээрэй. Chengdong-ийн урьдчилан бэлтгэсэн байшингууд. Apple байшин, онцгой хэлбэр, гоё дүр төрж, таны гэрийг илүү хувийн шинж чанартай болгоно. Бид таны хувийн амьдралын амьдралын хэв маягт тохирох энгийн орчин үеэс эхлээд хуучин загвар хүртэлх олон янзын загвар, өнгөний сонголтуудыг санал болгодог. Пекин Чэндонг нь хэрэглэгчийн хүсэл, шаардлагад анхаарал тавиад таны хүсэл, шаардлагын дагуу зохицуулан үйлдвэрлэх боломжийг олгодог. Таны хувийн сонирхол, хүсэл зорилоор таны байшингийн хэлбэр, дотор харагдац, усан хангамж, цахилгаан болон бусад зүйлийг өөрчлөх боломжтой. Танд бүрэн тохирох, ганцхан танд зориулсан гэр бүтээхийн тулд бид цахилгаан болон усны шугамыг урьдчилан барьж байрлуулдаг тул байшингийн дотор харагдацын ажлын дараа ус, цахилгааны шугамыг дахин байрлуулах ажлыг арилгадаг бөгөөд харагдацын үр ашгийг сайжруулдаг. Бид зочны өрөө, хооллох өрөө, унтлагын өрөө, ваннай өрөө гэх мэт дотор харагдацын олон төрлийн схемуудыг санал болгодог. Та өөрийн шаардлага, сонирхолд нийцүүлэн сонгож, өөрийнхөө ганцхан үзэсгэлэнтэй гэрлэх орчныг бүтээх боломжтой. Apple House - Амьдрах чанарын оргил! Apple House бол онцгой газар! Контейнер байршуулах замаар гэрээг илүү аюулгүй, илүү таатай болгоно. Бид бүх бүтцийн бүрэлдэхүүн хэсгийг багтаасан Контейнер дэлгүүр ашигладаг. Тэд бүгд үйлдвэрлэлийн стандартаар урьдчилан бүтээгдсэн. Зөв хэмжээ, тохируулга сонгох, та өөрийн шаардлагыг хангах амьдрах орон зайг хурдан барьж болно. Хэрэглэгчийн шаардлага, хүсэл сонирхолд тулгуурлан янз бүрийн модулиудыг гал тогоо, зочны өрөө эсвэл унтах өрөө зэрэг өөр өөр байр Нөхөн байгуулах үйл явц нь хялбар бөгөөд энгийн бөгөөд ямар ч онцгой техникийн мэдлэг шаарддаггүй. Энэ нь таны хувийн орон зай, түр ажлын байр, хадгалах газар эсвэл бусад хэрэгцээний хувьд, бидний урьдчилан боловсруулсан контейнер байр таны хэрэгцээг хангах зорилгоор бүтээгдсэн юм. Өнөөдөр контейнер өрөө аваад багахан өртөг, илүү сайхан үйлчилгээг хүртээрэй. Хөлөгдсөн гэр нь таны хэрэгцээний дагуу зохион байгуулагдаж, үйлдвэрлэлийг нэмэгдүүлэх, амьдрах орон зайг илүү аюулгүй, тогтвортой, найдвартай болгох боломжтой Контейнер агуулахтай холбоотой. Өрөөн нь янз бүрийн шаардлагыг хангах боломжтой, энэ нь та хаана ч, хэзээ ч тав тухтай байж болно гэсэн үг юм.Уурхай хүргэх! Тээвэрлэлт, багцлал маш хурдан байдаг. Бид хамгийн өндөр чанартай бүтээгдэхүүн авахын тулд танай тодорхойлолт дагуу тавигдах өрөөг багтаан хийх чадвартай баг таанч ажилладаг. Бид бүх хүргэх үйл явцыг хянах, таны эд зүйл нь аюулгүй газартаа хүрэхийг баталгаажуулах. Хамгийн гол нь, хувилбарын өрөөг газар дээр нь элсэлт хийлгэхгүйгээр суурилуулах нь хялбар бөгөөд суурилуулах үйл явцыг хурдан, хялбар болгохын тулд суурилуулах удирдамжийг санал Хэрэв та зааварчилгааг дагаж мөрдөж байвал тавигдах гэрийг байршуулах нь хялбар. CDPH нь аялалт модуль барилгын, загасч барилга, вилла барилгын төрөл бүрийг үйлдвэрлэдэг болон худалдаа хийдэг. Ачааллын табанд үндсэн шийдлийг олгоход бидний бүтээгдэхүүнүүд нь их төрлийн байдаг.Контейнер эмнэлэг
Контейнерийн сангийн давуу тал

Жижиглэн борлуулалт хийх худалдан авагчдад зориулсан өндөр чанартай бүтээгдэхүүн

Контейнерийг зохион байгуулахад ихэвчлэн гарч буй асуудлууд

Тэргүүлэх контейнерийн сангийн бүтээгдэхүүнүүдийн жижиглэнгийн үнэ
Why choose CDPH
Контейнер эмнэлэг?
Шинэ бүтээгдэхүүн модуль гэр
Цагдаагийн стил apple газар
Баярлалаа борлуулж байгаа контейнерийн гэр
Эрчимтэй фолдинг гэр
Холбоотой бүтээгдэхүүний ангилал
Хайж буй зүгээ олж чадаагүй байна уу?
Одоогоор санал хүсэлт ирүүлэх
Боломжит бүтээгдэхүүний талаар илүү дэлгэрэнгүй мэдээлэл авахын тулд бидний зөвлөхтэй холбоо барилцаа уу.Холбогдох
27+ Жил Туршлагатай
Инженерийн табаны үйлдвэрлэл