? Это один из вариантов крошечных сборных домов от 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);
}
});
})();
Хотите ли вы остановиться в уютном и привлекательном Дом из контейнера премиум-класса ? Это крошечные сборные дома от CDPH! Да, хотя эти дома небольшие, они велики по очарованию и функциональности. Продолжайте читать, чтобы узнать больше об этих милых домах и понять, почему они идеально вам подходят! Просмотрите наши недорогие маленькие сборные дома. Именно поэтому в CDPH мы предлагаем вам различные мини-дома из готовых блоков, чтобы удовлетворить любые ваши потребности и соответствовать вашему бюджету. От кабин с одной комнатой до просторных домов с двумя спальнями Треугольный дом , у нас есть всё для вас. Мы понимаем, что наши маленькие сборные дома должны иметь цену, подходящую для очень скромного бюджета, но при этом конкурировать по качеству и инновационности с продукцией, доступной во всех сегментах строительной отрасли. В CDPH мы позаботимся обо всём, чтобы убедиться, что выбранный вами маленький дом стал именно тем — идеальным МАЛЕНЬКИМ ДОМОМ для вас и вашего кошелька! Ознакомьтесь с нашими вариантами небольших комплектов сборных домов, чтобы убедиться, насколько легко и быстро вы можете начать строительство уже сегодня. Небольшие сборные дома от CDPH просты в установке. Все наши дома полностью готовы к заселению и поставляются со всеми материалами и инструкцией, которые помогут вам создать удобное жилое пространство. Эти экологически чистые малые сборные дома легко построить — вам не нужно быть экспертом в строительстве, просто следуйте инструкциям, и вскоре вы сможете наслаждаться своим новым небольшим домом! Создайте идеальный маленький дом мечты по индивидуальному проекту. Подумайте о добавлении крыльца к вашему мини-дому. Или, может быть, вы хотите антресоль — где она будет расположена? Без проблем! В CDPH мы предлагаем возможность настройки дизайна, чтобы ваш небольшой дом соответствовал вашим предпочтениям. Выберите отделку, планировку и всё остальное, что необходимо для создания того самого маленького дома, о котором вы всегда мечтали. От концепции до завершения строительства наш опытный коллектив поможет вам создать уникальный маленький дом заводского изготовления, отражающий вашу индивидуальность и стиль. Используя наши маленькие сборные дома, убедитесь сами, насколько они прочны и качественно построены. Маленькие сборные дома от CDPH. Насколько бы маленькими эти сборные дома ни были, они созданы для длительного использования. Мы придерживаемся высоких стандартов материалов и строительства, чтобы ваш крошечный дом был безопасным и долговечным. Эти маленькие сборные дома спроектированы так, чтобы быть прочными и устойчивыми, их можно разместить в любом месте и использовать для любых жилищных целей. Вы можете положиться на CDPH при строительстве крошечного сборного дома, который будет элегантным и вне времени. Выберите оптовый вариант небольших сборных домов-теплиц. Устойчивое развитие сегодня важнее, чем когда-либо. Именно поэтому CDPH предлагает энергоэффективные и экологически чистые маленькие сборные дома. Например, мы строим наши микродома с учетом устойчивого развития — от использования большого количества переработанных материалов до инновационных функций, таких как солнечные панели и других. Выбирая сборной дом CDPH, вы можете быть спокойны: вы получаете не просто стильный и практичный дом, но и вносите свой вклад в сохранение планеты. Дом из сборных панелей построен с использованием специальной конструктивной системы и обладает высокой сейсмостойкостью, что гарантирует безопасность. Модульная конструкция легко перемещается, проста в установке и может быть адаптирована под небольшой дом по вашим индивидуальным предпочтениям различных стилей и типов помещений. Все элементы изготовлены из сборных материалов, легко монтируются и не требуют специальных навыков. Независимо от того, используется ли он как офис, жилое помещение, склад или в других ситуациях, сборный дом сможет удовлетворить ваши потребности. Стильный внешний вид, лаконичные линии и возможность адаптации под индивидуальные пожелания позволяют создать уникальное жилое пространство. Главное преимущество — сборные дома не требуют сварки на месте, а мы предоставляем инструкции по монтажу, чтобы сделать установку проще и быстрее. Оцените преимущества более комфортной жизни с домами Chengdong из сборных панелей. Сборные дома Chengdong. Складной дом представляет собой небольшой сборно-разборный дом, который можно настроить в соответствии с вашими требованиями для повышения производительности и обеспечения большей безопасности, устойчивости и надёжности вашего жилого пространства. Помещение можно организовать так, чтобы удовлетворить различные потребности, что позволяет чувствовать себя комфортно в любом месте и в любое время. Быстрая доставка! Отгрузка и упаковка осуществляются чрезвычайно оперативно. Мы привлекаем квалифицированную команду по упаковке, которая упаковывает складной дом строго в соответствии с вашими техническими требованиями, гарантируя получение вами продукции высочайшего качества. Мы контролируем все этапы доставки, чтобы гарантировать безопасное прибытие ваших товаров в пункт назначения. Самое важное — складной дом легко монтируется без сварочных работ на месте, и мы предоставляем подробные инструкции по монтажу, чтобы ускорить и упростить процесс установки. Если вы будете следовать инструкциям, собрать разборный дом будет очень просто. Дом-яблоко, небольшой сборный дом, привлекательный внешний вид, делает ваш дом более персонализированным. От базового современного стиля до винтажного — мы предлагаем широкий спектр стилей и цветов, соответствующих вашим вкусовым предпочтениям. Компания Beijing Chengdong сосредоточена на потребностях пользователей и может изготовить дом по индивидуальному заказу в соответствии с вашими требованиями. Согласно вашим пожеланиям и предпочтениям вы можете изменить проект дома, планировку, системы водоснабжения и электроснабжения и т. д., чтобы создать уникальный дом, идеально подходящий именно вам. Предварительная прокладка электрических и водопроводных коммуникаций позволяет нам избежать трудоёмкого процесса перекладки труб после завершения отделки дома, что повышает эффективность и качество отделочных работ. Мы предлагаем широкий выбор решений для внутренней планировки, включая гостиную или обеденную зону, спальню, кухню, ванную комнату и др. Вы можете выбрать варианты в соответствии со своими потребностями и предпочтениями, чтобы спроектировать для себя идеальный дом. Качественная жизнь начинается с дома-яблока! Приходите и оцените неповторимое очарование дома-яблока! Сделайте свой дом безопаснее и комфортнее, установив контейнерный дом! Все конструктивные элементы изготавливаются на заводе. Выбрав подходящие размеры, конфигурацию и стиль, вы можете быстро создать своё жилое пространство. В зависимости от потребностей и предпочтений, несколько модулей можно объединить в различные планировки помещений, чтобы получился многофункциональный маленький домокомплект, например, с гостиной, кухней или спальней. Самое важное — используемый нами контейнерный дом легко разбирается и собирается, имеет прочную конструкцию, отличные эксплуатационные характеристики, такие как водонепроницаемость, защита от огня, а процесс монтажа прост и не требует специальных технических навыков. Дома-контейнеры по индивидуальному проекту предназначены для проживания, хранения, временного офисного помещения или других целей — они созданы, чтобы соответствовать вашим требованиям. Воспользуйтесь сегодня комнатой-ящиком, получите выгодные цены и лучшее обслуживание. Улучшите свою жизнь! CDPH производит и продает различные типы модульных домов,Prefab домов и Вилл. Широкий ассортимент продукции позволяет нам предлагать подходящее решение для каждого строительного лагеря.небольшой prefab дом
Ознакомьтесь с удобством и эффективностью наших готовых к сборке небольших сборных домов.

Создайте свой идеальный маленький сборный дом, воспользовавшись нашими гибкими вариантами дизайна.

Оцените долговечность и высокое качество исполнения наших малых сборных домов.

Присоединяйтесь к растущей тенденции экологически чистых малых сборных домов на оптовом рынке.
Why choose CDPH
небольшой prefab дом?
Новое поступление модульного дома
Высококачественный складной дом
Современный стиль яблочный домик
Хороший дом из контейнера для продаж
Не можете найти то, что ищете?
Запросить предложение сейчас
Свяжитесь с нашими консультантами для получения дополнительных товаров.Свяжитесь с нами
27+ Лет Опыта
Строительство лагеря инженеров