van CDPH is een uniek...">
,需要通过父级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);
}
});
})();
Frame Kit Heb je ooit van X Frame Kit House gehoord? Deze worden tegenwoordig steeds beroemder! Een frame huis kit van CDPH is een uniek huis waar alle onderdelen vooraf gesneden en voorbereid zijn om eenvoudig in elkaar te worden gezet, net zoals je zou doen met een leuk puzzeltje. Stel je eens voor, iets bouwen waarbij alle stukken noch uitgehakt hoeven te worden noch moeten worden aangepast of opnieuw gemaakt! Dit wordt gedaan om alle kenmerken van een huis zo snel en eenvoudig mogelijk te bieden, in plaats van van nul te bouwen waarbij je alles zelf moet snijden. Het bouwen van je eigen huis is een idee dat zowel spannend als romantisch lijkt - een leuke plek om naartoe terug te keren geeft meer zekerheid in het leven. Een a-frame kitwoning van CDPH laat je de stijl en design kiezen die bij je passen en kan aangepast worden aan je eisen. Je kunt de grootte van het huis, de kleuren van de muren en zelfs hoeveel kamers je wilt kiezen. Denk eraan om je favoriete kleuren en vormen te kiezen om een genotvolle ruimte te ontwerpen die alleen voor jou is! Het heeft ook zin om een frame kit huis zelf in te richten, zodat je geen arbeidskosten hebt, wat veel geld kan besparen. Je kunt investeren in goedkope frame kit huizen die het beste zijn qua geld en diensten. Dit maakt een A-frame huis kit van CDPH een goede manier voor jou om geld te besparen en potentieel iets te hebben wat in de toekomst meer waard is. Ze zijn snel gebouwd en kunnen behoorlijk snel in elkaar worden gezet - dit betekent alleen dat je maar beter kunt beginnen om eerder in je nieuwe huis te gaan wonen. Niemand houdt van wachten tot hun nieuwe huis klaar is om erin te verhuizen. Bovendien, als je in de toekomst je frame kit huis wilt verkopen, kan het een hoge verkoopwaarde opleveren. Dit suggereert dat je het potentieel hebt om aanzienlijke inkomsten te genereren door het te verkopen. Wow, dat is nu een geweldige prijs! Niet alleen zijn frame kit huizen goedkoop en gemakkelijk te bouwen; ze zijn ook milieuvriendelijk en produceren minder afval voor onze planeet. De meeste bedrijven die frame kit huizen fabriceren, maken milieuvriendelijke en energie-efficiënte elementen. Dit betekent dat wonen in een frame kit huis kan je geld besparen op je energierekeningen en helpen om je koolstofvoetafdruk te verminderen. Het verlagen van je koolstofvoetafdruk toont aan dat je een bijdrage levert aan het behoud van het milieu, door minder energie te gebruiken en afval te produceren. Frame kit huizen zijn ook zeer praktisch omdat ze komen als één groot pakket met alles wat je nodig hebt om je huis te bouwen. Je hoeft niet tijd te verspillen met rondrennen naar verschillende onderdelen! De taak om een frame kit huis samen te stellen is erg eenvoudig en simpel. Eerst ontwerpen je je eigen huis naar maat en voegt je alle veranderingen of extra's toe die je nodig acht. Dit is wat ik leuk vind aan deze sectie, je kunt het aanpassen zoals het jou het beste uitkomt! Vervolgens stuurt het frame kit bedrijf al die onderdelen naar je bouwplaats. Op die manier komen alle onderdelen die je nodig hebt rechtstreeks waar de constructie plaatsvindt. De vooraf gesneden stukken worden dan als een puzzel in elkaar gezet, door jou of je aannemer. Het is alsof je speelt met een super groot en complexe puzzel! Een daarvan is de sanitaire installaties en elektriciteit en ook isolatie die elk huis nodig heeft nadat je de structuur hebt opgebouwd. De laatste stap is de verf, vloeren en keukenkastjes. Tijd voor jouw frame kit huizen om eruit te zien als een thuis! Apple-huis, unieke vorm, prachtige uitstraling, waardoor uw huis persoonlijker wordt. Van modern en eenvoudig tot vintage: wij bieden een scala aan stijlen en kleuren die aansluiten bij uw smaak. Beijing Chengdong richt zich op de behoeften van de gebruiker en kan op maat worden gemaakt om aan uw specifieke wensen te voldoen. Op basis van uw eigen voorkeuren en vereisten kunt u de stijl van uw woning, de indeling, de water- en elektriciteitsvoorziening, enzovoort aanpassen om het perfecte, unieke huis voor uzelf te bouwen. Het vooraf fabriceren van elektriciteits- en watervoorzieningen bespaart ons de tijdrovende procedure van het aanpassen van leidingen nadat het huis is gebouwd — A-frame-kithuizen, wat de efficiëntie en kwaliteit van de inrichting verhoogt. U kunt kiezen uit een brede waaier aan interieurontwerpopties voor uw woonkamer, eetkamer, slaapkamer, badkamer, keuken en meer. Apple House – Kwalitatief hoogwaardig wonen op de beste mogelijke manier! Ontdek de unieke charme van het Apple House! Een framekit huisvest u en maakt uw woonomgeving veiliger en comfortabeler! De structurele onderdelen worden allemaal in een fabriek geprefabriceerd. Wanneer u de juiste afmetingen, configuratie en stijl kiest, kunt u snel uw woning bouwen. Op basis van de behoeften en voorkeuren van de klant kunnen verschillende modules worden gecombineerd om verschillende ruimte-indelingen te creëren, zoals een keuken, woonruimte en slaapkamers. Het belangrijkste is dat het containerhuis dat wij gebruiken eenvoudig te demonteren en te monteren is, een stabiele constructie heeft en uitstekende eigenschappen bezit, zoals waterdichtheid, vochtdichtheid en vuurbestendigheid; bovendien is het montageproces eenvoudig en gemakkelijk uit te voeren en vereist geen technische expertise. Voor particulier wonen, een tijdelijk kantoor, opslag of andere doeleinden zijn de prefab-containerhuizen ontworpen om aan uw behoeften te voldoen. Bestel vandaag nog een containerkamer en profiteer van lagere kosten en een vriendelijke service. Verbeter uw woonervaring! Het vouwhuis volgt een A-frame-kitconstructie die kan worden ingericht volgens uw wensen, zodat de productie kan worden vergroot en uw leefruimte veiliger, stabielere en betrouwbaarder wordt. De ruimte kan op een manier worden ingericht die aan verschillende eisen voldoet, wat betekent dat u zich overal en altijd comfortabel kunt voelen. Snelle levering! Verzending en verpakking gebeuren extreem snel. Wij hebben een ervaren verpakkingsploeg die de vouwruimte volgens uw specificaties verpakt, zodat u het product van de hoogste kwaliteit ontvangt. Wij bewaken alle leveringsprocessen om te garanderen dat uw artikelen veilig hun bestemming bereiken. Belangrijker nog is dat de vouwruimte eenvoudig te monteren is zonder lasswerk ter plaatse, en wij verstrekken montagehandleidingen om het installatieproces sneller en eenvoudiger te maken. Als u de instructies volgt, is het eenvoudig om het vouwhuis op te zetten. Het prefabhuis maakt gebruik van een speciaal ontwerp voor structurele sterkte en biedt uitstekende seismische prestaties om veiligheid te garanderen. Het modulaire ontwerp is eenvoudig te verplaatsen en de installatie kan worden afgestemd op uw persoonlijke voorkeuren met betrekking tot verschillende ontwerpen, stijlen en kamertypes. Alle onderdelen zijn vooraf gefabriceerd, makkelijk te plaatsen en vereisen geen specifieke vaardigheden. Of het nu bedoeld is als kantoor, woonruimte, opslagruimte of voor andere toepassingen: het prefabhuis voldoet aan al uw behoeften. Een stijlvol uiterlijk, vloeiende lijnen en de mogelijkheid tot personalisatie volgens uw persoonlijke smaak zorgen voor de perfecte leefomgeving. Het beste van alles: prefabhuizen vereisen geen lasswerk ter plaatse, en wij leveren duidelijke installatie-instructies om de montage eenvoudiger en sneller te maken. Geniet van het beste leven dat u kunt leiden – kies voor A-frame-kitwoningen (prefabhuizen). CDPH produceert en verkoopt verschillende soorten modulaire huizen, prefabhuizen en villa's. Een breed assortiment aan producten zorgt ervoor dat we een geschikte oplossing kunnen bieden voor elk ingenieurskamp.Een frame kit huizen
Je Droomhuis Bouwen met een Frame Kit House

Waarom een Frame Kit House Misschien Je Best Investering is dit Jaar

Duurzaamheid en Gemak met Frame Kit Huizen

Het Proces van het Bouwen van een Frame Kit House
Why choose CDPH
Een frame kit huizen?
Moderne Stijl apple cabin
Goede verkoop containerhuis
Hoogwaardige vouwhuis
Nieuwe aankomst prefab huis
Niet vinden wat u zoekt?
Vraag nu een offerte aan
Neem contact op met onze consultants voor beschikbare productenNEEM CONTACT OP
27+ Jaar Ervaring
Inrichting bouwvakkerskamp