, rostoucí segment na trhu s nemovitostmi, malé domy se staly...">
,需要通过父级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);
}
});
})();
Chcete se stěhat do nového domu? A ceny modulárních domů rostoucí segment v trendech nákupu domů jsou malé domy, které se staly skvělou možností, protože začleňují mnoho velmi atraktivních vlastností! Tak tedy; 5 důležitých důvodů, proč byste měli vážněji uvažovat o postavení domu s modulárním designem CDPH. Jednou z podivností modulárního domu je, že obvykle stojí levněji než běžný dům. Tyto domy jsou postavené v továrně a dělníci mohou vytvořit všechny různé části rychle, znovu bez potřeby připravovat čas. Jakmile jsou části vyrobeny, mohou být dopraveny na místo jejich konečného stavby. Tam dělníci všechno sestaví jako obrovskou skládačku. Tento typ stavby může ušetřit čas a peníze ve srovnání s postavením celého domu od nuly. Pokud hledáte výhodnou nabídku na nový dům, modulární byt může být dobrá volba! Jedna pěkná věc na CDPH malé modulární domy je, že lze je upravit podle vašich požadavků. Bude vám dáno potěšení vybírat mezi různými rozložením, velikostmi a barvami (váš může vypadat jinak než ukázkové fotografie). Návrhem ideálního domu pro svou rodinu. Pokud jste ekologicky zaměřený, modulární domy často nabízejí také možnost být ekologické: solární panely a recyklovaná izolace je dalším příkladem. Tímto způsobem můžete mít dům svého snu a stále pomáhat zachraňovat naši planetu. Říkají, že čas je peníze, a tohle se opravdu vztahuje i na stavbu s pomocí CDPH modulární dům pro prodej s modulárním domem, kde jsou komponenty vyrobeny v továrně, nejsou žádné zpoždění kvůli počasí, která by odsunula stavbu jako u tradičních metod. To znamená, že se nemusíte čekat (nebo zpomalovat) kvůli dešti nebo sněhu. Navíc jsou díly na místě sestaveny úžasně rychle a můžete se přestěhovat do svého nového domu snadno rychleji, než jste očekávali! Modulární domy nejsou pouze praktické; mohou být také velmi stylové! Všechny designy nabízejí možnosti prozkoumat moderní, tradiční nebo kombinaci obou stylů. A jsem si jistý, že budete chtít dodat svůj vlastní speciální dotyk. A cena modulárního domu samozřejmě jsou postaveny v továrně, takže můžete spoléhat na kvalitu výroby. Zásadně to znamená, že váš dům nebude vypadat jen skvěle, ale bude postaven tak, aby vydržel zkoušku časem! Nakonec, jednou z pěkných věcí je malý modulární dům je v tom, že mohou být hezké a praktické současně. V tomto blogovém příspěvku vám vysvětlím některé kreativní způsoby, jak navrhnout váš dům tak, aby vám vyhovoval. Může to být stejně jednoduché jako doplnění úložného prostoru nebo složitější, jako je otevřený podlažní plán, který dělá dům prostornějším a pozvánlivým. Můžete být si jisti, že vaše modulární dům bude funkčním, krásným místem s neomezenými možnostmi přizpůsobení a designovými prvky. Jablková chalupa, jedinečný tvar, krásný vzhled – udělá z vašeho domova více individuální prostor. Od základního moderního stylu až po vintage nabízíme širokou škálu stylů a barev, které vyhoví vašim estetickým preferencím. Společnost Beijing Chengdong se zaměřuje na přání uživatelů a nabízí možnost individuální úpravy podle vašich představ. Podle vašich vlastních přání a preferencí můžete upravit styl svého domu – modulární návrh domu, uspořádání prostor, rozvod vody a elektřiny atd. – a tak vytvořit dokonale osobní bydliště. Předem vyrobené elektrické a vodní potrubí nám umožňují vyhnout se časově náročnému převedení potrubí po dokončení interiéru, což zvyšuje efektivitu i kvalitu výbavy. Můžete si vybrat z široké nabídky řešení pro interiér vašeho obývacího prostoru, jídelny, ložnice, koupelny i kuchyně. Kvalitní život v Jablkové chalupě! Přijďte zažít jedinečné kouzlo Jablkové chalupy! Dům z kontejneru – zajistí vaši bezpečnost a učiní váš život pohodlnějším! Využíváme standardní modulární návrhy; všechny konstrukční prvky jsou součástí modulárního domu a jsou k dispozici ve správných rozměrech a uspořádání, takže můžete snadno postavit životní prostor odpovídající vašim požadavkům. V závislosti na potřebách a preferencích zákazníka lze různé moduly kombinovat za účelem vytvoření různých uspořádání místností, jako je kuchyně, obývací prostor nebo ložnice. Nejdůležitější je, že kontejnerový dům, který používáme, je snadno rozebíratelný a opětovně sestavitelný, má pevnou konstrukci a vyniká vlastnostmi jako vodotěsnost, odolnost proti korozi, protikorozní ochrana a požární bezpečnost; proces instalace je jednoduchý a snadno ovladatelný a nepotřebuje speciální technickou kvalifikaci. Ať už jde o osobní bydlení, skladování, dočasné kanceláře nebo jiné potřeby – naše předem vyrobené kontejnerové domy jsou navrženy tak, aby splnily vaše požadavky. Nyní je ideální čas pořídit si kontejnerový prostor a vychutnat si výhodnou cenu i pozorný zákaznický servis. Zlepšete si život zakoupením kontejnerového prostoru! Předem vyrobené domy jsou modulárního designu, snadno se sestavují a nepotřebují žádné zvláštní znalosti. Jsou vhodné pro kanceláře, bydlení, skladování nebo jakýkoli jiný účel. Skládací dům je navržen s využitím modulárního systému, který lze konfigurovat podle konkrétních potřeb vašeho domova. To umožňuje modulární návrh domu a zajišťuje, že váš domov bude bezpečnější, stabilnější a spolehlivější. Místnost lze kombinovat s dalšími místnostmi, aby vyhovovala různým požadavkům, což znamená, že se můžete pohodlně usadit kdekoli a kdykoli. Rychlá dodávka! Nabízíme také rychlé balení a doručování. Náš odborný tým pro balení zajistí zabalení vaší skladovací místnosti podle požadavků zákazníka. Budeme monitorovat každý krok procesu dodání, abychom zajistili, že vaše zboží bezpečně dosáhne cíle. Nejlepší na tom je, že skladovací místnost je snadné postavit bez nutnosti svařování na staveništi, a my poskytujeme pokyny pro instalaci, které zrychlí a usnadní celý proces montáže. Pokud pečlivě dodržíte všechny kroky průvodce, budete schopni dokončit stavbu svého skladovacího domu. CDPH vyrábí a prodává různé typy modulárních domů, prefabrikovaných domů a vilových domů. Široká škála produktů nás zabezpečuje poskytnout vhodné řešení pro každý táborový areál.Dům se systémem modulárního návrhu
Přizpůsobitelné a ekologické modulární domy

Úsporné výhody domů s modulárním návrhem

Inovativní návrhové schémata pro modulární domy

Stylová a funkční modulární architektura
Why choose CDPH
Dům se systémem modulárního návrhu?
Moderní styl apple chatrč
Dobrý prodej kontejnerového domu
Nová přírůstek prefabrikovaného domu
Vysokokvalitní skládací dům
Související kategorie produktů
Nemůžete najít, co hledáte?
Vyžádevat nabídku nyní
Kontaktujte naše konzulty pro více dostupných produktů.KONTAKT
27+ let zkušeností
Stavba táborového areálu