, tai...">
,需要通过父级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);
}
});
})();
Kurti namus su CDPH gali būti bauginantis uždavinys, tačiau su konteineriniai namai , tai yra smagu ir lengva. Be to, šie namai, kurie daugiausia statomi iš didelių metalinių konteinerių, pasižymi patvarumu, kuris gali būti tiek tvirtas, tiek ekologiškas. Peržiūrėkite kai kurias įspūdingiausias projektavimo idėjas mažose erdvėse – mažos, tvarių gyvenimo planų patalpos, nebrangūs ir stilingi dizainerių namai reiškia, kad galite gyventi svajonių name be atitinkamos kainos, o moduliniai pastatai, sukurti moderniam gyvenimui, kartu puikiai išlaiko bet kokias aplinkos sąlygas – visos šios savybės būdingos konteinerių namų planams. Mažos gyvenamosios patalpos projektavimo paslaptis – būti kūrybingam. Konteinerių namuose galimybės yra labai platos. Daugiafunkcinė baldų įranga ir sienų erdvės naudojimas – tai tik kelios būdų, kaip išnaudoti kiekvieną mažos erdvės colį. CDPH teikia konteinerių namų planus, kad galėtumėte savo erdvę panaudoti iki paskutinio colio. Kūrybiški sprendimai, skirti mažai gyvenamajai erdvei maksimaliai išnaudoti, sukuria pakankamai žavingą atmosferą, kad, turint patogią sofos vietą ir dubenį su kukurūzų gėrimu, net nepasigesite papildomos erdvės. Gyventi tvarią gyvenimo būdą – tai, ką turėtume daryti visi dėl mūsų žemės ateities. Konteineriniai namai yra puikus būdas sumažinti mūsų poveikį aplinkai ir jie sparčiai populiarėja. CDPH konteinerinių namų planai sukurti atsižvelgiant į tvarumą. Šie namai taip pat energijos vartojimo požiūriu efektyvūs, kadangi maksimaliai panaudojamas natūralus šviesa ir vėjas, siekiant padidinti dienos šviesos naudojimą ir sumažinti dirbtinio apšvietimo bei oro kondicionavimo poreikį. Išplėstinių patalpų dizainas Konteineriniai namai turi patalpų išdėstymą, kuris yra tiek lanksčiai pritaikomas, tiek didėjantis, kartu lengvai keičiamas ir pritaikomas prie skirtingų oro sąlygų. Namų statyba gali būti brangi – bet ne visų. Nereikia aukoti išvaizdos, gyvenant konteineriniame name. CDPH konteinerinių namų planai yra prieinami ir nekenkia kokybei bei dizainui. Homestead modelis gali būti personalizuotas atsižvelgiant į namo savininkų poreikius ir pageidavimus, todėl tapo madingu ir protingu pasirinkimu daugelio namų savininkų. Konteineriniai namai taip pat yra labai moduliniai. Namai statomi iš atskirų konteinerių, kuriuos galima dėlioti ir pridėti įvairiais deriniais, kad būtų sukuriamos atskiros gyvenamosios erdvės. CDPH konteinerinių namų planai yra modulinės konstrukcijos, todėl juos lengva konfigūruoti pagal jūsų poreikius. Jei reikia dar vieno miegamojo, namų kabineto ar net svečių namo, konteineriniai namai yra specialiai sukurti, kad atitiktų jūsų besikeičiančius poreikius. Todėl jie tapo populiarūs moderniuose namuose. Kiekviena šeima yra unikali, turinti savo gyvenimo būdą. CDPH žino, kad kiekviena šeima yra unikali, todėl visi jų konteinerinių namų planai yra visiškai lankstūs. Nuo miegamųjų skaičiaus iki virtuvės ir svetainės vietos – savininkai gali pastatyti konteinerinį namą, kuris tiktų jų kasdieniam gyvenimui. Ar tai maža šeima ar pora, kuri nenori būti apkrauta papildoma erdve ir priežiūra, susijusia su ja, konteinerinis gyvenimas gali būti idealus variantas jums. Skleidžiamasis namas seka tradicinio namo modulinį stilių, kuris gali būti sukonfigūruotas pagal jūsų reikalavimus, kad būtų pasiekta masinė gamyba ir jūsų gyvenamosios aplinkos taptų stabilesnė, saugesnė ir patikimesnė. Patalpos gali būti lankstiai sujungiamos, kad atitiktų įvairius poreikius, todėl galite gyventi konteinerinių namų planuose bet kur ir bet kada. Greita pristatymo paslauga! Pakavimas ir pristatymas taip pat vyksta greitai: naudojame profesionalią pakavimo komandą, kuri pakuoja skleidžiamąją patalpą pagal jūsų nurodytas specifikacijas ir užtikrina, kad gautumėte aukščiausios kokybės produktą. Visus pristatymo procesus stebėsime, kad užtikrintume, jog jūsų prekės saugiai ir patikimai pasiektų paskirties vietą. Skleidžiamąją patalpą galima montuoti be statybvietėje reikalingo konstrukcijos suvirinimo, o mes pateikiame montavimo instrukcijas, kurios padarys šį procesą greitesnį ir paprastesnį. Jei tik laikysitės visų instrukcijų žingsnių, susklastyto namo surinkimas bus lengvas. Obuolių kambarys, unikali forma, gražus išvaizda, padarys jūsų namus individualiais. Nuo pagrindinio modernaus iki vintage stiliaus – siūlome platų stilių ir spalvų asortimentą, kuris atitiks jūsų skonį. Beijing Chengdong koncentruojasi į vartotojų pageidavimus ir gali derinti pagal jūsų norus. Remdamiesi savo pageidavimais ir pomėgiais, galite modifikuoti namo stilių, konteinerinių namų planus, išdėstymą, vandens ir elektrikos sistemas ir kt., kad sukurtumėte idealų jums pritaikytą namą. Elektros bei vandens vamzdžių iš anksto sumontavimas padeda išvengti ilgo vamzdžių perkėlimo proceso po to, kai namas apstatomas, dėl ko padidėja apdailos darbų efektyvumas ir kokybė. Galite pasirinkti iš plačios vidinės erdvės dizaino sprendimų įvairovės gyvenamajai ervei, valgomajai vietai, miegamajam, voniai, taip pat virtuvėms ir vonioms. Aukštos kokybės gyvenimas – Obuolių name! Ateikite patirti unikalaus Obuolių namo žavesio! Kontainerinis namas – užtikrinkite savo saugumą ir padarykite savo gyvenimą patogesnį! Mes naudojame standartinius modulinius projektus, visi konstrukciniai elementai yra kontainerinių namų grindų planų komponentai ir pateikiami tiksliais matmenimis bei išdėstymu, todėl galite lengvai sukonstruoti gyvenamąją erdvę, atitinkančią jūsų poreikius. Priklausomai nuo kliento poreikių ir pageidavimų, skirtingi moduliai gali būti sujungti į įvairius planus – virtuvės, gyvenamosios erdvės ir miegamojo. Svarbiausia pažymėti, kad naudojamas kontainerinis namas yra lengvai surenkamas ir išardomas tvirtos konstrukcijos, puikiai atsparus vandeniui, korozijai, šarminiam poveikiui ir ugniai; montavimo procesas yra paprastas ir lengvai valdomas, specialių techninių įgūdžių nereikia. Ar tai būtų asmeninis gyvenimas, sandėliavimas, laikinoji biuro patalpa ar kitokie poreikiai – mūsų pramoniniu būdu gaminami kontaineriniai namai sukurti tam, kad tenkintų jūsų reikalavimus. Tai puikus metas įsigyti kontainerinę patalpą ir pasinaudoti palankia kaina bei dėmesinga klientų aptarnavimo paslauga. Gerinkite savo gyvenimą – įsigykite kontainerinę erdvę! Iš anksto pagamintosios namų konstrukcijos yra lengvai surinkamos ir nereikalauja jokių specialių žinių. Jos gali būti naudojamos kaip konteinerinių namų planavimo schemos, biurų sandėliai ar bet kokiais kitais tikslais. CDPH gamina ir parduoda įvairius moduliinius namus, prefabrikatus ir vilios namus. Platus produktų spektras leidžia mums siūlyti tinkamą sprendimą kiekvienam inžinerijos kampei.Konteinerinių namų planai
Atsakingas gyvenimas su universaliais planais

Ekonomiški ir stilingi būsto sprendimai

Moduliniai pastatai šiuolaikiniam gyvenimui

Tinkamai derinami planai unikaliems gyvenimo būdams
Why choose CDPH
Konteinerinių namų planai?
Aukštos kokybės sudedamasis namas
Suaugių stilius Apple kabina
Gerai pardavinė konteinerio namų
Nauji prieinami prefabrikatuoti namai
Susijusios prekių kategorijos
Nerandate to, ko ieškote?
Prašyti pasiūlymo dabar
Susisiekite su mūsų konsultantais dėl papildomų prekių.Susisiekite
27+ metų patirties
Inžinerijos kampų statyba