? Det er i små prefabrikkede huse fra CDPH! Ja, selvom disse huse er små, er de...">
,需要通过父级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);
}
});
})();
Vil du gerne bo i et hyggeligt og charmerende Luksuscontainerbolig ? Det kan du i de små prefabrikkede huse fra CDPH! Ja, selvom disse huse er små, er de store i charme og funktionalitet. Læs videre for at opdage mere om disse søde huse og hvorfor de er ideelle til dig! Gennemse vores billige små prefabrikkede huse. Derfor tilbyder CDPH dig forskellige mini prefabrikkede huse, der dækker alle dine behov og budget. Fra en enkeltværelses hytte til et 2-værelses rummeligt Trekantet Hus , har vi det hele til dig. Vi ved, at vores små prefabrikkede huse skal have en pris, der passer til et meget beskedent budget, men alligevel konkurrere med kvaliteten og innovationen inden for alle områder af boligbyggebranchen. Hos CDPH tager vi os af alt for at sikre, at det lille hus, du vælger, er præcis dét — det perfekte SMÅHUS for dig og din økonomi! Se vores små prefabrikkerede husers klar til samling muligheder for at se, hvor nemt og effektivt du kan komme i gang allerede i dag. De små prefab-huse fra CDPH er nemmere at installere. Alle vores huse er helt turnkey, komplette med alle materialer og en instruktionsvejledning, der hjælper dig med at bygge dit eget behagelige boligområde. Små prefab-huse, der er meget miljøvenlige og nemme at bygge – du behøver ikke at være byggeekspert, følg bare instruktionerne, og så bør du snart nyde dit nye lille hus! Personificer det ultimative småhus i dit drømme. Overvej at tilføje en veranda til dit tiny house. Eller måske ønsker du en loftetagen – hvor skal den placeres? Intet problem! Vi giver dig denne mulighed hos CDPH med skræddersyede designmuligheder, der passer til din smag i dit lille prefabrikkede hus. Vælg din beklædning, layout og alt det, du har brug for, for at få det lille hjem, du altid har ønsket dig. Fra idé til færdiggørelse kan vores erfarne team hjælpe dig med at skabe et customiseret lille prefabrikket hus, der afspejler din unikke smag og stil. Mens du bruger vores små prefabrikkede huse, kan du opleve holdbarheden og kvalitetsudførelsen. Små Prefabrikkede Huse fra CDPH. Uanset hvor små disse prefabrikkede huse måtte være, er de bygget til at vare længe. Vi overholder høje standarder for materialer og konstruktion, så dit lille hjem er sikkert og varigt. Disse små prefabrikkede huse er designet til at være stærke og stabile, kan placeres hvor som helst og tjener alle formål i en bolig. Du kan regne med, at CDPH bygger et elegant og tidløst prefabrikket minihus. Gå med på det lille prefabrikkerede huse, som er en bæredygtig drivhusløsning. Bæredygtighed er i dag vigtigere end nogensinde før. Derfor tilbyder CDPH energieffektive og miljøvenlige små prefabrikkerede huse. Vi bygger vores mikrohuse med fokus på bæredygtighed – fra brug af genbrugsmaterialer til innovative funktioner som solceller og andet. Når du vælger et CDPH lille prefabrikeret hus, kan du være tryg ved, at du ikke kun får et stilrent og praktisk hjem, men også gør din del for at redde planeten. Den færdigbyggede bolig er bygget med et specielt strukturelt design og har god seismisk ydeevne for at sikre sikkerheden. Det modulære design er nemt at flytte, installere, og kan tilpasses i små færdigbyggede huse efter dine personlige præferencer for forskellige stilarter, rumtyper. Alle elementer er fremstillet af prefabrikerede materialer og nemme at montere uden behov for særlige færdigheder. Uanset om det er tiltænkt kontor, beboelse, opbevaring eller andre formål, kan den færdigbyggede bolig opfylde dine behov. Stilfuld udseende, slanke linjer og kan tilpasses dine individuelle præferencer for at skabe et unikt boligareal. Bedst af alt kræver færdigbyggede huse ikke svejsning på stedet, og vi leverer installationsvejledning for at gøre installationen nemmere og hurtigere. Oplev fordelene ved at leve et mere komfortabelt liv med Chengdong færdigbyggede huse. Chengdong færdigbyggede huse. Det foldbare hus følger en lille prefabrikeret bolig, som kan tilpasses efter dine krav for at øge produktionskapaciteten og gøre dit boligområde mere sikkert, stabilt og pålideligt. Rummet kan indrettes på forskellige måder for at imødekomme forskellige behov, hvilket betyder, at du kan føle dig komfortabel overalt og til enhver tid. Hurtig levering! Forsendelse og emballage er ekstremt hurtige. Vi beskæftiger et fagligt emballageteam i henhold til dine specifikationer for emballering af det foldbare rum, så du modtager et produkt af højeste kvalitet. Vi overvåger alle leveringsprocesser for at sikre, at dine varer ankommer sikkert til deres destination. Mest vigtigt er, at det foldbare rum er nemt at montere uden svejsning på stedet, og vi leverer monteringsvejledninger for at gøre din installationsproces hurtigere og nemmere. Hvis du følger instruktionerne, er det nemt at opstille det foldbare hus. Apple-bolig, lille færdigbygget hus, smuk udseende, gør dit hjem mere personlig. Fra grundlæggende moderne til vintage tilbyder vi en række stilarter og farver, der passer til dine smagsmæssige behov. Beijing Chengdong fokuserer på brugernes behov og kan tilpasses efter dine krav. I henhold til dine ønsker og præferencer kan du ændre designet af dit hus, opstillingen, vand- og elinstallationer osv., for at skabe et individuelt hjem, der er perfekt for dig. Forudfremstilling af elektriske og vandledninger gør det muligt at undgå den tidskrævende proces med at omarrangere rør, når huset er indrettet, hvilket øger effektiviteten og kvaliteten af indretningen. Vi tilbyder en bred vifte af indre opstillingssmuligheder, herunder stue eller spisestue, soveværelse, køkken, badeværelse osv. Du kan vælge efter dine behov og præferencer for at designe det perfekte hjem til dig. Kvalitetsliv – fra Apple-boligen! Kom og oplev den unikke appel på Apple-boligen! Gør dit hjem sikrere og mere behageligt ved at installere et containerhus! Alle strukturelle komponenter er præfabrikerede i en fabrik. Ved at vælge de rigtige dimensioner, konfiguration og stil kan du hurtigt skabe dit boligareal. I henhold til behov og præferencer kan flere moduler integreres i forskellige rumopstillinger for at opnå et multifunktionelt, lille præfabrikeret hus som f.eks. stue, køkken eller soveværelse. Det vigtigste at bemærke er, at det containerhus, vi bruger, er nemt at adskille og samle, har en solid konstruktion med fremragende ydeevne, såsom vandtæthed, beskyttelse mod vand og brand, og installationsprocessen er let og enkel at håndtere, og kræver ikke særlige tekniske færdigheder. Til privat beboelse, opbevaring, midlertidigt kontorlokaler eller andre formål er de præfabrikerede containerhuse designet til at opfylde dine behov. Gør brug af et kastelrum i dag, nyd en bedre pris og bedre service. Forbedr dit liv! CDPH producerer og sælger forskellige typer modulhus, prefab hus og villa hus. Et bredt udvalg af produkter sikrer os at kunne levere en passende løsning til hver arbejdslejr.lille prefab hus
Oplev bekvemmeligheden og effektiviteten i vores færdigmodulerede små prefabrikerede huse.

Tilpas dit drømmehus i form af et lille prefabrikeret hus med vores fleksible designmuligheder.

Oplev holdbarheden og den kvalitetsmæssige håndværksekspertise i vores små prefabrikerede huse.

Deltag i den voksende tendens til miljøvenlige små prefabrikerede huse på det internationale marked.
Why choose CDPH
lille prefab hus?
Nyt ankommet prefabriceret hus
Høj kvalitet sammenlægningsbar hus
Modern Stil æble hytte
Godt salgscontainerhus
Kan du ikke finde, hvad du leder efter?
Bed om et tilbud nu
Kontakt vores konsulenter for flere tilgængelige produkter.Kontakt os
27+ År Af Erfaring
Arbejdslejr Bygge