, la vivienda mínima ha become...">
,需要通过父级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);
}
});
})();
¿Estás buscando mudarte a una nueva casa? Una precios de las viviendas modulares segmento en alza en las tendencias de compra de casas, la casa tiny ha become una gran opción ya que incorpora muchas características muy atractivas. Así que aquí vamos; 5 razones importantes por las que deberías considerar construir una casa modular CDPH. Una de las maravillas de una casa modular es que, típicamente, son más baratas que una casa estándar. Estas se construyen en una fábrica y los trabajadores pueden hacer todas las partes rápidamente, una vez más sin necesidad de tiempo para prepararse. Una vez creadas las partes, pueden ser transportadas al lugar de su construcción final. Allí, los trabajadores lo ensamblan todo como si fuera un enorme rompecabezas. Este tipo de construcción puede ahorrar tiempo y dinero en comparación con la construcción de una casa completa desde cero. Dicho esto, si estás tratando de encontrar una ganga para tu nueva casa, lo modular podría ser el camino a seguir. Una cosa buena de CDPH casas modulares pequeñas es que se pueden adaptar a tus necesidades. ¡Tendrás la diversión de elegir entre varias opciones de planos de pisos, tamaños y colores! (la tuya puede verse diferente a las fotos de muestra). Al diseñar la casa ideal para tu familia, si eres consciente del medio ambiente, las casas modulares suelen tener la posibilidad de ser ecológicas también: paneles solares e isolación reciclada es otro ejemplo. De esta manera puedes tener la casa de tus sueños mientras ayudas a salvar nuestro planeta. Dicen que el tiempo es dinero, y esto realmente se aplica también a la construcción con la ayuda de CDPH. casa modular en venta . Al tener una casa modular con los componentes fabricados en una fábrica, no hay retrasos por el clima que puedan retrasar la construcción como ocurre con los métodos tradicionales. Esto también significa que no tendrás que esperar (o retrasarte) debido a la lluvia o la nieve. Además, las partes se ensamblan increíblemente rápido en el lugar, ¡así que puedes mudarte a tu nueva casa más rápido de lo esperado! Las casas modulares no solo son prácticas; ¡también pueden ser muy elegantes! Con todo diseño, hay oportunidades para explorar estilos modernos, tradicionales o una combinación de ambos. Y estoy seguro de que querrás darle un toque especial propio. Y costos de casa modular por supuesto se construyen en una fábrica, así que puedes confiar en la calidad del producto. Básicamente, esto significa que tu hogar no solo lucirá genial, sino que estará construido para durar mucho tiempo! Por último, una de las cosas buenas es casa modular pequeña es que pueden ser bonitos y prácticos al mismo tiempo. En este post del blog, déjame explicarte algunas maneras creativas de diseñar tu casa de manera que se adapte bien a ti. Puede ser algo tan simple como un almacenamiento adicional o algo más complejo como tener un plano de piso abierto, haciendo que la casa parezca más espaciosa e invitadora. Puedes estar seguro de que tu hogar modular será un lugar funcional y hermoso con características de personalización y diseño ilimitadas. Casa Apple, forma única y aspecto elegante que aporta un toque más personalizado a su hogar. Desde estilos modernos básicos hasta vintage, ofrecemos una amplia gama de diseños y colores que satisfacen sus preferencias estilísticas. Beijing Chengdong se centra en las necesidades del usuario y puede personalizar la vivienda según sus gustos. De acuerdo con sus propios deseos y preferencias, puede modificar el estilo de su casa, su distribución, instalaciones de agua y electricidad, etc., para crear un hogar único, perfectamente adaptado a usted. La prefabricación de las tuberías eléctricas y de fontanería nos permite evitar el largo proceso de reubicación de dichas instalaciones una vez finalizada la decoración, lo que incrementa la eficiencia y la calidad de la misma. Puede elegir entre una amplia variedad de soluciones de diseño interior para su salón, comedor, dormitorio, baño, así como para cocinas y baños. ¡Una vida de alta calidad en la Casa Apple! ¡Venga a descubrir el encanto único de la Casa Apple! Casa contenedor: ¡garantizamos su seguridad y hacemos que su vida sea más cómoda! Utilizamos diseños modulares estándar; todos los componentes estructurales son elementos para casas modulares y están disponibles en las dimensiones y distribuciones adecuadas, lo que le permite construir fácilmente un espacio habitable adaptado a sus necesidades. Según los requisitos y preferencias del cliente, se pueden combinar distintos módulos para crear diversas distribuciones de estancias, como cocina, salón y dormitorio. Lo más importante a destacar es que la casa contenedor que utilizamos posee una estructura sólida, fácil de desmontar y montar, con excelentes prestaciones tales como impermeabilidad, resistencia a la corrosión, protección contra la corrosión y protección contra incendios; además, su proceso de instalación es sencillo y fácil de gestionar, sin requerir conocimientos técnicos especializados. Ya sea para vivienda particular, almacenamiento, oficina temporal u otras necesidades, nuestras casas prefabricadas contenedor están diseñadas para satisfacer sus requerimientos. ¡Este es el momento perfecto para adquirir una habitación contenedor y disfrutar de un precio más asequible, así como de un servicio al cliente atento! Mejore su calidad de vida comprando un espacio contenedor. Las casas prefabricadas son viviendas de diseño modular que se ensamblan fácilmente y no requieren conocimientos especializados. Son adecuadas para oficinas, viviendas, almacenamiento o cualquier otro fin. La casa plegable está diseñada con un sistema modular que puede configurarse según las necesidades específicas de su hogar. Esto permite una casa de diseño modular y hace que su hogar sea más seguro, estable y resistente. La habitación puede combinarse con otras habitaciones para satisfacer diferentes requisitos, lo que significa que puede vivir cómodamente en cualquier lugar y en cualquier momento. ¡Entrega rápida! También ofrecemos un servicio rápido de embalaje y entrega. Nuestro equipo experto en embalaje empacará su habitación plegable según los requisitos del cliente. Monitorearemos cada paso del proceso de entrega para garantizar que sus artículos lleguen a su destino de forma segura. Lo mejor es que la habitación plegable es fácil de construir sin necesidad de soldadura en el sitio, y proporcionamos instrucciones de instalación para hacer que su proceso de instalación sea más rápido y sencillo. Si sigue todos los pasos de la guía y cumple con ellos, podrá finalizar la construcción de su casa plegable. CDPH fabrica y vende varios tipos de casa modular, casa prefabricada y casa de villa. Una amplia gama de productos nos asegura proporcionar una solución adecuada para cada campamento de ingeniería.Diseño modular de la casa
Casas Modulares Personalizables y Ecológicas

Beneficios Ahorradores de Tiempo de las Casas de Diseño Modular

Esquemas de Diseño Innovadores para Casas Modulares

Arquitectura Modular Estilosa y Funcional
Why choose CDPH
Diseño modular de la casa?
Cabaña de estilo moderno apple
Buena Ventas contenedor casa
Nueva llegada casa prefabricada
Casa plegable de alta calidad
Categorías de productos relacionados
¿No encuentra lo que busca?
Solicite una Cotización Ahora
Póngase en contacto con nuestros consultores para obtener más productos disponibles.Póngase en contacto
27+ Años De Experiencia
Construcción de Campamentos de Ingeniería