da CDPH ...">
,需要通过父级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);
}
});
})();
Ei, amigos do faça você mesmo! Você sonha em construir sua própria casa com as suas próprias mãos? Deseja uma casa dos sonhos sobre rodas? Bem, com os kits da CDPH casas modulares de design moderno , sonhos podem se tornar realidade! É como se você estivesse montando um quebra-cabeça gigante, exceto que no final você terá uma casa criada por você, que é ao mesmo tempo confortável e estilosa. Agora, vamos entrar nos detalhes do incrível mundo dos kits de casas modulares. O que há de ótimo nesses kits para casas modulares é que todos são projetados para a pessoa que gosta de fazer as coisas por conta própria. O kit vem com tudo o que você precisa para construir sua casa — desde as paredes e o telhado até as janelas. Você não precisará perder tempo indo e vindo da loja de materiais de construção ou vasculhando plantas baixas complexas — tudo está logo ali no kit. Você ainda pode contar com amigos e familiares para ajudar, transformando o processo numa oportunidade divertida de fortalecer os laços entre todos. Imagine ter a capacidade de construir sua casa dos sonhos exatamente como deseja. Graças à CDPH casas modulares modernas , esse sonho pode se tornar realidade. Dos plantas baixas às elevações externas, das opções de design ao local onde você mora na comunidade, existem inúmeras razões para construir uma casa semi-personalizada exatamente de acordo com suas especificações. Seja você deseja um chalé charmoso no meio da floresta ou uma casa moderna à beira da praia, há um kit adequado para você. E com instruções passo a passo, você conseguirá montar tudo rapidamente. Os kits de casas modulares da CDPH são fáceis de construir e divertidos de decorar, mas também são acessíveis e conscientes do ponto de vista ambiental. Como todas as peças já vêm pré-cortadas e prontas para uso, você gastará menos com a construção. Além disso, esses kits são fabricados com materiais sustentáveis, permitindo que você se sinta bem por reduzir sua própria pegada de carbono enquanto constrói uma linda casa para você e sua família. Um dos aspectos mais legais da CDPH moderna design de casas modulares é a oportunidade de personalizar o seu espaço. Quer um quarto extra? Sem problema! Precisa de uma cozinha maior? Você consegue! Usando esses kits, você pode adicionar ou remover salas, reconfigurar o layout ou até mesmo atualizar componentes como pisos e bancadas. Com uma infinidade de opções, você poderá projetar uma casa verdadeiramente única e que se adapte às suas necessidades. Cabine Apple, formato exclusivo, aparência elegante, tornando sua casa mais personalizada. Desde o moderno simples até o vintage, oferecemos uma variedade de estilos e cores para atender às suas necessidades pessoais. Os kits para casas modulares focam nos desejos e requisitos do usuário. Podem ser personalizados conforme suas necessidades. Com base em seus desejos e preferências pessoais, você pode modificar o estilo da sua casa, o layout, a instalação hidráulica e elétrica, entre outros aspectos, para criar a casa perfeita, única e feita sob medida para você. Instalamos antecipadamente as tubulações elétricas e hidráulicas, o que evita a tarefa demorada de reorganizar essas instalações após a decoração da casa, melhorando assim a eficiência e a qualidade do acabamento. Oferecemos uma gama de layouts para o interior da sua casa, incluindo salas de estar e de jantar, quartos, cozinha, banheiros, etc. Você pode escolher conforme suas necessidades e preferências, para construir a casa ideal para você. Qualidade de vida, desde a primeira morada Apple! Descubra o charme exclusivo da Casa Apple! Torne sua casa mais segura e confortável ao construí-la com contêineres! Todos os elementos estruturais são fabricados em fábricas. Ao escolher as dimensões, a configuração e o design adequados, é possível construir sua casa rapidamente. Com base em suas necessidades e preferências, diversos módulos podem ser combinados em diferentes layouts de cômodos, criando um espaço habitacional multifuncional, como sala de estar, cozinha ou kits para casas modulares. O mais importante a destacar é que nossa casa de contêiner é fácil de montar e desmontar, possui estrutura estável e excelente desempenho — por exemplo, é impermeável, resistente à corrosão, anticorrosiva e à prova de fogo — além de ter instalação simples e intuitiva, não exigindo conhecimentos técnicos específicos. As casas de contêiner que construímos são personalizadas conforme suas necessidades, seja para residência particular, escritórios temporários, depósitos ou qualquer outro uso. Agora é a hora de adquirir uma sala em contêiner e aproveitar um preço mais acessível, bem como um atendimento ao cliente mais atencioso. Melhore sua qualidade de vida adquirindo uma sala em contêiner! A casa pré-fabricada é construída com um projeto estrutural especial e possui bom desempenho sísmico, garantindo a segurança dos kits para casas modulares. Seu design modular facilita o transporte e a instalação, podendo ser personalizado conforme suas preferências pessoais, com diferentes estilos e tipos de cômodos. Todos os elementos são fabricados em material pré-fabricado e de fácil montagem, não exigindo habilidades técnicas específicas. Seja para uso como área residencial, espaço comercial, depósito ou outras finalidades, as casas pré-fabricadas atendem às suas necessidades. Aparência elegante, linhas modernas e possibilidade de personalização de acordo com suas preferências individuais permitem criar um espaço habitacional único. O melhor de tudo é que as casas pré-fabricadas não exigem soldagem no local, e também fornecemos instruções detalhadas para instalação, tornando esse processo mais fácil e rápido. Aproveite os benefícios de uma vida mais confortável: escolha as casas pré-fabricadas Chengdong. A casa dobrável é construída segundo um padrão modular que permite ser configurada conforme os requisitos dos seus kits de casas modulares. Isso possibilita a produção em massa e torna sua casa mais segura, estável e confiável. Além disso, o espaço pode ser combinado de forma flexível para atender a diferentes necessidades de uso, permitindo-lhe desfrutar de uma experiência residencial confortável a qualquer momento e de qualquer lugar. Entrega rápida! O processo de entrega e embalagem é extremamente ágil. Contamos com uma equipe especializada em embalagem, que prepara a sala dobrável conforme suas especificações, garantindo que você receba o melhor produto possível. Monitoramos cada etapa do processo de entrega para assegurar que seus itens cheguem ao destino em perfeitas condições. Trata-se também da opção mais conveniente, pois a sala se dobra facilmente e pode ser montada no local sem necessidade de soldagem, e fornecemos instruções de instalação para facilitar e agilizar sua montagem. Se seguir nossas instruções, a instalação da casa dobrável será simples. A CDPH fabrica e vende vários tipos de casa modular, casa pré-fabricada e casa de villa. Uma ampla gama de produtos garante que possamos fornecer uma solução adequada para cada acampamento de engenharia.Kits de casas modulares
Construindo sua casa dos sonhos com kits de casas modulares

Vida econômica e sustentável com kits de casas modulares

Personalizando seu espaço com kits de casas modulares

Kits de casas modulares revolucionando a indústria
Why choose CDPH
Kits de casas modulares?
Cabine apple no Estilo Moderno
Boas Vendas casa de contêiner
Nova chegada casa pré-fabricada
Casa dobrável de alta qualidade
Categorias de produtos relacionados
Não encontrou o que procura?
Solicite uma cotação agora
Entre em contato com nossos consultores para obter mais produtos disponíveis.Entre em Contato
27+ Anos de Experiência
Construção de Acampamento de Engenharia