">
,需要通过父级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);
}
});
})();
Att utveckla ett hem med CDPH kan verka som en överväldigande uppgift, men med container Homes är det roligt och enkelt. Och det finns en robusthet i dessa hus, som främst är byggda av stora metallcontainrar, vilket både kan vara slitstarkt och miljövänligt. Ta en titt på några av de mest lysande designerna för boende på små ytor – små, hållbara boplanscher, lågkostnads- och stilrena designershus innebär att du kan bo i drömhuset utan motsvarande pris, och modulbyggnader, ritade för moderna livsstilar men med förmågan att tåla alla typer av miljöer, ingår alla i containerhusets boplanscher. Knepet med att designa ett litet vardagsrum är att vara kreativ. Möjligheterna är många när det gäller containervillor. Möbler som kan användas till flera saker och att optimera utrymmet på dina väggar är bara några sätt att få ut mesta möjliga av små ytor. CDPH tillhandahåller ritningar för containervillor så att du kan använda vartenda tums yta. Kreativa lösningar för att maximera ett litet boende skapar en charmig atmosfär där du, med en bekväm soffa och en skål popcorn, knappt kommer sakna det extra utrymmet. Att leva på ett hållbart sätt är något som vi alla måste göra, för jordens framtid. Behållarhus är ett utmärkt sätt att minska vår påverkan på miljön och blir allt mer populära. CDPH:s behållarhus har ritats med fokus på hållbarhet. Dessa hus är också energieffektiva, eftersom naturligt ljus och vind utnyttjas för att maximera dagsljusutnyttjande och minimera behovet av konstbelysning och luftkonditionering. Omfattande rumskonstruktioner Behållarhus har rumskonstruktioner som är både anpassningsbara och expanderbara, samt enkla att ändra och modifiera efter olika väderförhållanden. Hus kan vara dyra att bygga – men inte alla. Det finns ingen anledning att kompromissa med avseende på utseende när man bor i ett behållarhus. CDPH:s behållarhusplaner är prisvärda utan att kringa på kvalitet och design. Homestead kan personaliseras för att möta hushållens behov och önskemål, och har därför blivit ett modernt och klokt val bland många hushåll. Containerhus är också mycket modulära. Husen byggs från enskilda containrar som kan staplas och läggas till i olika konfigurationer för att skapa separata boendemiljöer. CDPH:s planlösningar för containerhus är modulära i sin design, vilket gör dem lätta att konfigurera enligt dina behov. Om du behöver ett extra sovrum, ett hemmabibliotek eller till och med ett gästhus, är containerhus precis anpassade för att möta dina föränderliga behov. Det är därför de blivit populära i moderna hem. Varje familj är unik, med sitt eget sätt att leva. CDPH vet att varje familj är unik, därför är alla deras planlösningar för containerhus helt flexibla. Från antalet sovrum till placeringen av kök och vardagsrum kan ägare bygga ett containerhus som passar deras vardag. Oavsett om du är en liten familj eller ett par som inte vill ha onödigt mycket utrymme och den underhållspåfrestning som följer med, kan boende i container vara en perfekt lösning för dig. Det fällbara huset följer den modulära stilen hos ett traditionellt hus och kan konfigureras enligt dina krav för att möjliggöra massproduktion samt göra din bostadsmiljö mer stabil, säker och trygg. Rummen kan kombineras på ett flexibelt sätt för att möta olika behov, så att du kan bo i containerbostadens grundplaner var som helst och när som helst. Snabb leverans! Förpackning och leverans sker också snabbt – vi använder ett professionellt förpackningsteam som förpackar det fällbara rummet enligt dina specifikationer och säkerställer att du får en produkt av högsta kvalitet. Vi övervakar hela leveransprocessen för att säkerställa att dina varor anländer till sin destination på ett säkert och tryggt sätt. Det fällbara rummet kan monteras utan att strukturen svetsas på plats, och vi har installationsanvisningar som gör processen snabbare och enklare. Så länge du följer alla steg i anvisningarna är det enkelt att slutföra monteringen av det fällbara huset. Apple-bostad, unik form, vacker utseende, gör att ditt hem blir mer personligt. Från grundläggande modern till retro – vi har ett brett utbud av stilar och färger som kan möta dina stilpreferenser. Beijing Chengdong fokuserar på användarens önskemål och kan anpassas enligt dina preferenser. Baserat på dina egna önskemål och preferenser kan du ändra din bostads stil, containerhusets planlösning, layout, vatten- och elinstallationer m.m., för att skapa ett individuellt hem som passar dig perfekt. Förfabricering av el- och vattenledningar hjälper oss att undvika den tidskrävande processen att omplacera ledningarna när huset är inredd, vilket ökar effektiviteten och kvaliteten i inredningen. Du kan välja bland ett brett utbud av inredningslösningar för ditt vardagsrum, matsal, sovrum, badrum samt kök och badrum. Högkvalitativt liv, hos Apple House! Kom och upplev den unika charm som Apple House erbjuder! Containerhus – säkerställ din säkerhet och gör ditt liv mer bekvämt! Vi använder standardiserade modulära designlösningar, där alla strukturella komponenter är delar av containerhusens golvplan och finns i rätt dimension och layout, så att du enkelt kan bygga ett bostadsutrymme som passar dina krav. Beroende på kundens behov och preferenser kan olika moduler kombineras för att skapa olika layouter för rum som kök, vardagsrum och sovrum. Det viktigaste att notera är att de containerhus vi använder är lättmonterbara och -demonterbara med en solid konstruktion, som erbjuder utmärkta egenskaper såsom vattentätning, korrosionsbeständighet, anti-korrosionsfunktion och brandskydd; installationen är dessutom enkel och lätt att hantera och kräver ingen särskild teknisk expertis. Oavsett om det gäller privat boende, förvaring, tillfällig kontorsanläggning eller andra behov är våra färdiga containerhus utformade för att uppfylla dina krav. Nu är den perfekta tidpunkten att skaffa ett containerutrymme och njuta av ett mer prisvärdt erbjudande samt engagerad kundservice. Förbättra ditt liv genom att köpa ett containerutrymme! De färdiga husen är lätta att montera och kräver ingen särskild kunskap. De kan användas som containerhusgolvplan, kontorslagring eller till vilket annat ändamål som helst. CDPH tillverkar och säljer olika typer av modulära hus, förfabrikata hus och villa hus. En bred produktrange garanterar att vi kan erbjuda en lämplig lösning för varje arbetsläger.Grundplaner för containervillor
Hållbart boende med mångsidiga grundplaner

Kostnadseffektiva och stilrena bostadslösningar

Modulbyggnader för moderna livsstilar

Anpassningsbara layouter för unika boendekonfigurationer
Why choose CDPH
Grundplaner för containervillor?
Högkvalitativt foldbart hus
Modern Stil äppelkabin
God Salu containerhus
Nytt försäljnings prefab-hus
Hittar du inte det du letar efter?
Begär offert nu
Kontakta våra konsulter för fler tillgängliga produkter.Kontakta oss
27+ År Av Erfarenhet
Arbetsläger Bygge