сколько стоит модульный дом...">
,需要通过父级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, такая как сколько стоит модульный дом примером такого дома может быть модульный дом-комплект. Статья посвящена модульным домам-комплектам и тому, почему вы можете найти их полезными для семьи, такой как ваша. Основным образом, дом из готового комплекта — это тот тип жилья, который строится на заводе и доставляется на ваш участок. Было сказано, что такие дома состоят из модулей, а не собираются целиком на месте. Затем эти модули идеально соединяются на том месте, где вы хотите жить. Одной из его замечательных особенностей является то, что вы можете легко изменить комплектацию под свои предпочтения. Это позволяет вам выбрать размер дома, расположение комнат на каждом этаже и цвет/финишные материалы для вашего нового дома. Это означает, что выбор будет очень субъективным в зависимости от вашего стиля и требований. Есть множество причин, почему выбор в пользу дома из prefab-комплекта для вашего следующего дома может стать самым умным решением, которое вы когда-либо примите, вместе с что такое модульный дом созданными CDPH... Основные причины этого в том, что, по сравнению с обычным домом, на его строительство требуется меньше времени. Поскольку основные элементы изготавливаются вне строительной площадки, нет необходимости беспокоиться о задержках из-за погодных условий или подобных проблем при строительстве на заводе. Ваш дом может быть собран всего за две недели. Одной из главных причин является то, что дома из prefab-комплектов часто более экологичны, чем традиционные. Эти дома в целом потребляют меньше энергии (так что вы экономите на счетах за электричество), Для некоторых, строительство дома — это тяжелая и сложная работа, но на самом деле готовый комплект для сборного дома делает всё намного проще, а также CDPH цены на модульные дома . Как только вы выберете характеристики и отделку для вашего дома, потребуется всего несколько недель, чтобы собрать всё вместе на месте строительства. Это приближает вас к переезду в новый дом и началу жизни там как можно скорее. Вскоре вы сможете начать создавать воспоминания в своём новом доме. Более дешевый: готовый комплект для модульного дома может стоить дешевле, чем реальный дом, идентичный по prefabricated house china произведено CDPH. Строительство также проще, и поскольку закупка материалов может производиться оптом, общая стоимость может оказаться ниже. Это отлично подходит для семей с небольшим бюджетом. А так как эти дома часто строятся с учетом большей энергоэффективности — застройщик не экономит на других моментах, поэтому возврат инвестиций означает низкие ежемесячные счета. То есть у вас будет больше денег на другие удовольствия. Идея модульного дома также полезна для окружающей среды, так как во время строительства производится гораздо меньше отходов, а материалы, из которых они сделаны, такие как экологически чистые, полезны для Земли. Существует несколько типов модульных домов. Владельцы модульных домов, кроме того, в этом варианте вы можете выбрать, как будет выглядеть ваш дом и какие материалы использовались для его строительства, вместе с продукцией CDPH. сборный маленький дом это быстрый и простой в строительстве улей, что многие оценивают. Кроме того, готовые дома из prefab kit экономически эффективны и экологичны, что делает их разумным выбором для вас во всех отношениях. Сделайте свой дом безопаснее и комфортнее, установив контейнерный дом! Все конструктивные элементы изготавливаются на заводе. Выбрав подходящие размеры, конфигурацию и стиль, вы можете быстро создать своё жилое пространство. В зависимости от потребностей и предпочтений можно объединить несколько модулей в различные планировки помещений, чтобы получить многофункциональный домокомплект, например, с гостиной, кухней или спальней. Самое главное — используемый нами контейнерный дом легко разбирается и собирается, имеет прочную конструкцию и отличные эксплуатационные характеристики: водонепроницаемость, защиту от воды, пожара, а процесс монтажа прост и удобен в управлении и не требует специальных технических навыков. Дома-контейнеры из сборных модулей предназначены для проживания, хранения, временного офисного пространства или других целей — они созданы, чтобы соответствовать вашим требованиям. Воспользуйтесь комнатой-ящиком уже сегодня, получите выгодную цену и лучший сервис. Улучшите свою жизнь! Дома из prefab-комплектов просты в строительстве и не требуют специальных навыков. Их можно использовать для проживания, офиса, хранения или любой другой цели. Дом в форме яблока, уникальная форма, красивый внешний вид, сделает ваш дом более персонализированным. У нас есть различные стили и цвета, которые подойдут вашему индивидуальному вкусу — от простого современного до традиционного. Компания Beijing Chengdong специализируется на комплектных домах из сборных элементов, которые могут быть адаптированы под ваши потребности. Чтобы удовлетворить ваши личные пожелания и предпочтения, вы можете заказать индивидуальный дизайн дома, планировку, разводку водопровода и электричества и т.д., чтобы создать для вас идеальный эксклюзивный дом. Мы проектируем и прокладываем электрические и водопроводные коммуникации ещё до начала строительства, что позволяет избежать трудоёмкого процесса перепланировки водопровода и электропроводки после отделки дома, а также повышает эффективность отделочных работ и качество исполнения. Вы можете выбрать из широкого спектра решений по внутренней отделке для гостиной, столовой, спальни, кухни и других помещений. Качественная жизнь начинается с Apple House! Apple House — это особое пространство! Складной дом следует модульному стилю традиционного дома, который можно настроить в соответствии с вашими требованиями для массового производства и сделать вашу жилую среду более стабильной, безопасной и защищённой. Помещения можно гибко комбинировать, чтобы удовлетворить различные потребности, поэтому вы можете разместиться в сборно-разборном доме где угодно и когда угодно. Быстрая доставка! Упаковка и доставка также осуществляются оперативно: мы используем профессиональную упаковочную команду, которая упакует складное помещение в соответствии с вашими техническими требованиями, обеспечивая получение продукта высочайшего качества. Мы контролируем все этапы доставки, чтобы гарантировать, что ваш товар прибудет в пункт назначения безопасно и надёжно. Складное помещение можно установить без сварки конструкции на месте, а наши инструкции по монтажу сделают процесс ещё быстрее и проще. Если вы будете следовать всем шагам инструкции, собрать складной дом не составит труда. CDPH производит и продает различные типы модульных домов,Prefab домов и Вилл. Широкий ассортимент продукции позволяет нам предлагать подходящее решение для каждого строительного лагеря.Дом из готовых комплектов
Преимущества выбора дома из готовых комплектов для вашей следующей недвижимости

Быстрое и простое строительство дома с использованием комплекта prefab

Доступное и устойчивое проживание в доме из готовых комплектов

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