kan u helpen met onze modul...">
,需要通过父级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);
}
});
})();
Dat is een manier om dingen sneller en goedkoper te bouwen. Geen probleem, CDPH kan u helpen met behulp van ons modulaire bouwsysteem! Inzicht in modulair bouwen Modulair bouwen is wanneer we gebouwen in stukken bouwen, een beetje zoals bouwstenen, en die stukken daarna als een puzzel aan elkaar voegen. Dit versnelt de bouwfase aanzienlijk en stelt ons in staat onze ontwerpen op maat te maken per individueel geval. CDPH + Worksmodular Bouwen heruitgevonden met CDPH Wij bij CDPH weten dat het cruciaal is om geld te besparen. Daarom bieden wij redelijk geprijsde modulaire gebouwen tegen groothandelsprijzen aan. De basisgedachte is dat we een gebouw kunnen verdelen in secties in plaats van het hele gebouw ineens te bouwen, wat leidt tot besparingen op arbeid en materialen = besparingen voor U! Onze modulaire gebouwen zijn het antwoord op de gebeden van particuliere klanten die op zoek zijn naar nieuwe kantoor- of klaslokalen tegen groothandelsprijzen. Tijd is geld, en bij CDPH , kennen we de waarde van elke minuut en munteenheid. Daarom bieden we tijdige en versnelde modulaire constructie voor commerciële projecten. Dat betekent dat met onze modulaire bouwtechnologie uw nieuwe gebouw snel klaar is! We hebben een team van ervaren professionals die hard werken om uw project op tijd en binnen budget af te ronden. Met CDPH , zijn lange wachttijden verleden tijd! Er is een perfecte oplossing voor op CDPH , die zorgt over het milieu. De milieuvriendelijke modulaire bouwopties voor klanten die milieubewust willen handelen. Eenvoudig door het gebruik van geschikte materialen, samen met efficiënte bouwmethoden, verminderen we afval en energieverbruik. Bovendien zijn onze modulaire gebouwen ontworpen met energie-efficiëntie in gedachten, zodat u kunt besparen op uw nutsvoorzieningen. Bouw gerust, wetende dat u een verschil maakt met CDPH . Bij CDPH , we begrijpen het. We weten dat elk project anders is en passen het proces aan op basis van uw specifieke behoeften. Daarom bieden we aanpasbare modulaire ontwerpen om elk probleem met uw project op te lossen. We kunnen onze modulaire gebouwen volledig volgens uw ontwerpen maken, of het nu gaat om een kantoor met één ruimte of een enorm magazijn. U hebt volledige controle over het gebouw, van indeling tot afwerking en alles daartussenin. De hemel is de grens met CDPH ! Met CDPH , kunt u er zeker van zijn dat uw modulaire gebouw is gebouwd met de beste materialen en architectuur die mogelijk is. Uw modulaire constructie wordt gebouwd door experts en we gebruiken alleen de hoogste kwaliteitsmaterialen. AVABLU DEVELOPMENT Vanaf de grond, van fundering tot dak — er zitten hier geen extra’s in, alleen klasse en kwaliteit. Met CDPH kunt u er zeker van zijn dat uw modulaire gebouw u nooit in de steek zal laten. Apple-huis, unieke vorm, modulair gebouw, maak uw huis persoonlijker. We bieden een verscheidenheid aan stijlen en kleuren om te voldoen aan uw esthetische behoeften, van modern en eenvoudig tot vintage. Beijing Chengdong richt zich op de behoeften van de gebruiker en kan volledig op maat worden gemaakt om aan uw specifieke wensen te voldoen. U kunt uw ideale woning creëren door de indeling, de water- en elektriciteitsverdeling, de vorm en andere factoren naar eigen voorkeur aan te passen. Wij bouwen de elektriciteits- en watervoorzieningen al tijdens de bouwfase, waardoor u de moeite bespaart om deze na de inrichting van uw woning opnieuw te moeten aanleggen, en waardoor de efficiëntie en kwaliteit van de inrichting toenemen. Wij bieden diverse indelingen voor uw interieur, zoals woonkamer of eetruimte, slaapkamer en badkamer, enzovoort. U kunt kiezen op basis van uw behoeften en voorkeuren om de perfecte omgeving voor uzelf te creëren. Kwalitatief hoogwaardig leven, vanaf het Apple-huis! Ontdek de unieke charme van het Apple-huis! Maak uw woning veiliger en comfortabeler door een containerhuis te installeren! Alle structurele onderdelen worden in een fabriek geprefabriceerd. Door de juiste afmetingen, configuratie en stijl te kiezen, kunt u uw woonruimte snel realiseren. Aan de hand van hun behoeften en voorkeuren kunnen meerdere modules in verschillende indelingen worden geïntegreerd om een multifunctioneel, modulair gebouw te vormen, zoals een woonkamer, keuken of slaapkamer. Het belangrijkste om op te merken is dat het containerhuis dat wij gebruiken eenvoudig te demonteren en opnieuw te monteren is, met een stevige constructie en uitstekende prestaties, zoals waterdichtheid, brandwerendheid en een eenvoudig en overzichtelijk installatieproces dat geen bijzondere technische expertise vereist. Voor persoonlijk wonen, opslag, tijdelijke kantoorruimte of andere doeleinden zijn de prefab-containerhuizen ontworpen om aan uw specifieke eisen te voldoen. Profiteer vandaag nog van een boxruimte, geniet van een betere prijs en betere service, en verbeter uw levenskwaliteit! De geprefabriceerde huizen zijn modulaire bouwdelen die gemakkelijk in elkaar kunnen worden gezet en vereisen geen speciale kennis. Ze zijn geschikt voor kantoor, woonruimte, opslag of enig ander doel. Het vouwhuis is gebaseerd op de modulaire bouw van een traditioneel huis, wat volgens uw wensen kan worden ontworpen, toelaat massaproductie te realiseren en uw leefomgeving veiliger en stabielere maakt. De ruimte kan op een flexibele manier worden ingezet om aan verschillende eisen te voldoen, wat betekent dat u comfortabel kunt wonen, waar en wanneer dan ook. Snelle levering! Verpakking en levering verlopen eveneens snel, aangezien wij professionele medewerkers in dienst hebben voor de verpakking, die het vouwhuis volgens uw specificaties verpakken om u een product van de hoogste kwaliteit te garanderen. Wij volgen elke stap van het leveringsproces nauwlettend op om ervoor te zorgen dat uw producten veilig en onbeschadigd op hun bestemming aankomen. Het vouwhuis kan ter plaatse worden opgebouwd zonder lassen en wij verstrekken duidelijke montage-instructies om het proces sneller en eenvoudiger te maken. Als u de stappen in de instructies volgt, kunt u de montage van het vouwhuis probleemloos en zelfstandig afronden. 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.modulair gebouw
Snelle en efficiënte modulaire constructie voor commerciële projecten

Eco-vriendelijke modulaire bouwopties voor duurzaamheidsbewuste kopers

Aanpasbare modulaire ontwerpen om aan al uw projectbehoeften te voldoen

Materialen en constructie van hoge kwaliteit voor duurzame modulaire structuren
Why choose CDPH
modulair gebouw?
Moderne Stijl apple cabin
Goede verkoop containerhuis
Nieuwe aankomst prefab huis
Hoogwaardige vouwhuis
Gerelateerde productcategorieën
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