fra CDPH er et unikt...">
,需要通过父级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);
}
});
})();
Rammekit Har du hørt om X Rammekithus? Disse blir kjente disse dagene! Et ramme hus kit fra CDPH er et unikt hjem hvor alle komponentene er forhåndskslitt og forberedt til å bli samlet sammen enkelt, akkurat som du ville med et spennende puslespill. Tenk deg å bygge noe der ingen deler må skjeres ut eller trenger å bli justert eller gjort om! Dette gjøres for å gi alle funksjonene i et hus på den raskeste og enkleste måten det kan gjøres, istedenfor å bygge fra bunnen av der du må kutte noe selv. Å bygge ditt helt eget hjem er en ide som ser både opphissende og romantisk ut - å ha et fint sted å komme tilbake til gir trygghet i livet. A ramme sett hjem fra CDPH lar deg velge stil og design som passer for deg og kan bli endret etter dine krav. Du kan velge størrelse på huset, farger på veggene og også hvor mange rom du ønsker. Tenk på å velge dine favorittfarger og former for å designe en nyttig plass som er bare for deg! Det har også mening å montere et rammesett hus selv slik at du unngår arbeidskostnader, noe som kan spare mye penger. Du kan investere i billige rammesett huser som er beste når det gjelder penger og tjenester. Dette gjør at ett ramme hjemsett fra CDPH en god måte for deg å spare penger og potensielt ha noe som kan være verdt mer i fremtiden. De er raskt å bygge og kan samles sammen ganske effektivt - dette betyr bare at du like godt bør begynne å bo i din nye hus først. Ingen liker å vente på det nye huset sitt å flytte inn i. Dessuten, hvis du ønsker å selge ditt ramme-kit-hus i fremtiden, kan det få en høy salgspris. Dette antyder at du har potensial til å oppnå en betydelig inntekt ved å resell det. Wow, nå det er en bra pris! Ikke bare at ramme-kit-hus er billige og enkle å bygge; de er også miljøvennlige og lager mindre avfall for vår planet. Fleste selskaper som produserer ramme-kit-hus skaper miljøvennlige og energieffektive elementer. Dette betyr at å bo i et ramme-kit-hjem kan spare deg penger på dine energiregninger og hjelpe med å redusere din karbonfotavtrykk. En nedgang i karbonfotavtrykket viser at du bidrar til miljøet, grunnet mindre energibruk og produksjon av avfall. Rammekits hus er også veldig praktisk fordi de kommer som en stor pakke med alt du trenger for å bygge hjemmet ditt. Du må ikke spille tid på å løpe rundt etter ulike deler! Oppgaven med å samle et rammekithus er veldig enkel og simpel. Først designer du hjemmet ditt til mål og legger til alle endringer eller tillegg som du mener er hensiktsmessig. Dette er hva jeg elsker med denne delen, du kan justere det slik at det passer best for deg! Deretter sender rammekitselskapet alle disse komponentene til byggestedet ditt. På denne måten vil alle delene du trenger oppnå framvist akkurat der hvor byggingen foregår. De forhåndskslittne bitene monteres så sammen som et puslespill, enten av deg eller av din byggearbeider. Det er som å spille med et super stort og komplekst puslespill! En av dem er også plasseringen av rørlegging og elektrisk installasjon samt isolering som hvert hus trenger når rammen er bygget opp. Siste trinn er fargen, gulvet og skapene. Tid for ditt a ramme kit hjem til å se ut som et hjem! Apple-hytte, unik form, vakker utseende, gjør hjemmet ditt mer personlig. Fra moderne og enkle til vintage-stiler – vi tilbyr et bredt utvalg av stilarter og farger som passer dine smakskrav. Beijing Chengdong fokuserer på brukerbehov og kan tilpasses for å oppfylle dine spesifikke behov. I henhold til egne preferanser og krav kan du endre stil, plassering, vann- og elektrikkanlegg osv. i huset ditt for å bygge det perfekte, unike hjemmet ditt. Prefabrikasjon av elektriske og vannrør lar oss unngå den tidkrevende prosessen med å endre rør etter at huset er ferdigstilt, noe som gjelder spesielt for A-ramme-byggesett, og øker effektiviteten og kvaliteten på interiøret. Du kan velge mellom et bredt utvalg av innredningsløsninger for stue, spisestue, soverom, bad, kjøkken og mer. Apple-hytte – kvalitetsbolig på best mulig måte! Oppdag den unike sjarmen i Apple-hytten! Et rammebyggesett gir hus, og gjør livet ditt tryggere og mer behagelig! Strukturelle komponenter er alle forhåndsfremstilt i en fabrikk. Når du velger passende dimensjoner, konfigurasjon og stil, kan du bygge ditt hjem raskt. Basert på kundens behov og preferanser kan ulike moduler kombineres for å skape ulike romoppsett, som kjøkken, stueområde og soverom. Den viktigste faktoren er at containerhuset vi bruker er lett å montere og demonte, har en stabil konstruksjon og utmerket ytelse – for eksempel vann- og fuktsikkerhet samt brannsikkerhet – og monteringsprosessen er enkel og lett å håndtere, uten krav til spesiell teknisk kompetanse. For privat bolig, midlertidig kontor, lagring eller andre behov er prefabrikerte containerhus designet for å tilfredsstille dine behov. Bestill et containerrom i dag og nytt godt prisnivå samt en mer venlig service. Forbedre din boopplevelse! Foldehuset følger et A-ramme-byggesett som kan arrangeres i henhold til dine krav for å øke produksjonen og gjøre ditt boligareal tryggere, mer stabilt og pålitelig. Rommet kan arrangeres på en måte som tilpasser ulike behov, noe som betyr at du kan føle deg komfortabel overalt og når som helst. Hurtig levering! Frakt og emballasje skjer svært raskt. Vi har et faglig utdannet emballasjeteam som pakker foldehuset etter dine spesifikasjoner, slik at du får et produkt av høyeste kvalitet. Vi overvåker hele fraktprosessen for å sikre at varene dine kommer trygt frem til destinasjonen. Viktigst av alt er at foldehuset er enkelt å montere uten sveising på stedet, og vi tilbyr monteringsanvisninger for å gjøre monteringsprosessen raskere og enklere. Hvis du følger instruksjonene, er det enkelt å sette opp det foldbare huset. Ferdighusets konstruksjon er spesielt utformet for å sikre strukturell styrke og gir god seismisk ytelse for å garantere sikkerhet. Modulært design gjør det enkelt å flytte huset, og installasjonen kan tilpasses etter dine personlige preferanser når det gjelder ulike design, stiler og romtyper. Alle komponenter er ferdigprodusert og enkle å montere på plass, og det kreves ingen spesielle ferdigheter. Uansett om det skal brukes som kontor, bolig, lager eller i andre sammenhenger, kan det ferdigproduserte huset oppfylle dine behov. Stilig utseende, glatte linjer og mulighet til å tilpasse huset etter dine personlige smak, slik at du skaper et perfekt livsrom. Best av alt: Ferdighus krever ikke sveising på stedet, og vi leverer monteringsinstruksjoner for å gjøre montering enklere og raskere. Velg A-rammebygg-kitt hus – ferdighus for det beste livet du kan ha. CDPH produserer og selger ulike typer modulære huse, Prefab hus og Villa hus. Et bredt utvalg av produkter sikrer oss å kunne tilby en passende løsning for hver anleggsleir.Et ramme-kit hus
Bygge ditt drømmehus med en ramme-kit hus

Hvorfor en ramme-kit hus kanskje er din beste investering i år

Bærekraft og bekvemhet med ramme-kit hus

Prosessen for å bygge et ramme-kit hus
Why choose CDPH
Et ramme-kit hus?
Moderne Stil apple hytte
God salg container hus
Høy kvalitet sammenlappbart hus
Nytt ankommet prefabhus
Ikke funnet det du leter etter?
Be om tilbud nå
Kontakt våre rådgivere for flere tilgjengelige produkter.Ta kontakt
27+ År Med Erfaring
Anleggsleirbygging