fikri əla həll ola bilər. Nəzərdə tutduğum odur ki, bir ev...">
,需要通过父级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);
}
});
})();
Əgər özünüz və ailəniz üçün rahat bir ev yaratmaq istəyirsinizsə, onda Lüks Konteyner Evi əla fikir ola bilər. Mənim fikrimcə, metal bir böyük qutudan ibarət ev demək, başqa cür desək, bu, ağırlaşır. Bu olduqca qəribə səslənir, lakin əlçatmazlıq, ekoloji təmizlik və fərdiləşdirmə meylləri ilə yanaşı, konteyner evlər sürətlə yayılmaqdadır. Bundan əlavə, konteyner evlər CDPH tərəfindən araşdırılan həyəcanverici sahədir! Digər çoxları konteyner evləri ənənəvi evlərin yalnız kiçik bir hissəsinə başa gəlir. İstifadə edilmiş bir konteyner almaq konvensional evdən xeyli ucuzdur və yaratıcı bacarıqlarınızla onu tez bir zamanda ev kimi görünüş verə bilərsiniz. Konteyner evlərlə yalnız xərcləri azaltmaq deyil, həm də rahat şəraitdə yaşamaq mümkündür. Daşınma konteyner evləri mühit üçün yaxşıdır? Köhnə daşınma konteynerləri tullantı və mühitə zərər ehtimalı olmadan ev tikməyin əla yoludur. Bu, resursların qorunmasına kömək edir və ətraf mühitə daha çox çirklənmə yaratmaqdan bizi xilas edir. Buna görə də planet üçün həqiqətən yaxşıdır. Hətta günəş paneli və yağıntı suyunu toplama sistemləri əlavə etsəniz, yeni konteyner eviniz daha da ekoloji dizayna uyğun ola bilər. Konteyner evlər praktiki olaraq arzunuzu həyata keçirmək üçün istifadə edə biləcəyiniz nəhəng Lego blokları kimidir. Onları bir-birinin üstünə qoya, onları birləşdirə və hətta pəncərə və qapılar kəsə bilərsiniz! Dizayn baxımından sayısız imkan mövcuddur və bu imkanlar saqlama konteyner evi . Siz parlaq və müasir görünüş, rahat və kənd tipli atmosfer seçə bilərsiniz və ya orta bir şey tapa bilərsiniz. Konteyner ev sizə xəyal etdiyiniz unikal evi yaratmaq üçün imkan verir. Saxlama Konteyner Evi həyatın minimalist çeşidinə yaxşı bir seçim təklif edir. Saxlama konteynerləri kiçik və səmərəlidir və bu o deməkdir ki, boşluqları strategiyaya uyğun istifadə etməli və yalnız həqiqətən ehtiyac duyduqlarını saxlamalısınız. Həyatınızı sadələşdirmək və sıxılmaz hala gətirmək sizə daha çox yer qazandıracaq, stresdən azad olmağınıza və sakitliyinizi qorumağınıza kömək edəcək. Saxlama konteyner evləri minimalistlər və həyatın həqiqətən vacib şeylərini qəbul etmək istəyənlər üçün ideal həlldir. Proses asanlıqla tərsinə döndərilməlidir və tez-tez səyahət edənlər və ya köçmək istəyənlər bunun əvəzinə saxlama konteyner evini seçə bilərlər. Saxlama konteynerləri daşınmaq üçün hazırlanmış olduğundan, evinizi hər yerdə özünüzə götürə biləcəyiniz mənaya gəlir. Böyük şəhərdə sığınacaq axtarırsınızsa, gözəl mavi göyün altında qovşaqlı sahələr və çaylar boyu yaşayırsınızsa və ya mədəniyyətdən uzaqda ermit kimi yaşayırsınızsa, ZombieBox saxlama konteyner evlərindən biri ilə evinizə bir az daha yaxın hiss edə bilərsiniz. Saxlama konteyner evi sizə azadcasına gəzməyə və həyatı öz tempinizdə yaşamağa imkan verir. Saxlama konteyner evlərini yığmaq asandır və xüsusi bacarıqlar tələb etmir. Onlardan yaşayış, ofis, anbar və ya digər məqsədlər üçün istifadə etmək olar. saxlama konteyner evləri — yaşamağı daha təhlükəsiz və rahat edir! Konstruktiv komponentlərin hamısı fabrikdə öncədən hazırlanır. Uyğun ölçüləri, konfiqurasiyanı və üslubu seçdikdə evinizi sürətlə yarada bilərsiniz. Müştərinin ehtiyaclarına və preferensiyalarına əsaslanaraq müxtəlif modullar birləşdirilərək mətbəx, oturma otağı və yataq otaqları kimi müxtəlif otaq planlaşdırmaları yaradıla bilər. Ən vacib amil odur ki, istifadə etdiyimiz konteyner evləri asanlıqla sökülə və yığıla bilər, sabit struktura malikdirlər və suya, rütuba və yanğına davamlılıq kimi üstün xüsusiyyətlərə sahibdirlər; həmçinin montaj prosesi asandır, idarə etmək sadədir və heç bir ixtisas bacarığı tələb etmir. Şəxsi yaşayış, müvəqqəti ofis, saxlama və ya digər ehtiyaclar üçün prefabrik konteyner evləri tamamilə sizin ehtiyaclarınıza uyğun hazırlanmışdır. Bu gün konteyner otağı əldə edin və daha aşağı qiymət və daha nəzakətli xidmətdən zövq alın! Yaşama təcrübənizi artırın! Qatlanan ev klassik evlərin modullu üslubunu qəbul edir və kütləvi istehsalı təmin etmək üçün sizin tələblərinizə uyğun olaraq layihələndirilə bilər; bu da yaşayış sahənizin daha təhlükəsiz, sabit və etibarlı olmasını təmin edir. Bundan əlavə, qatlanan otaq müxtəlif istifadə tələblərini ödəmək üçün çoxfunksiyalıdır; beləliklə, evinizin rahatlığını hər zaman və hər yerdə hiss edə bilərsiniz. Sürətli çatdırılma! Paketləmə və çatdırılma prosesi sürətlidir, çünki biz paketləməni sizin tələblərinizə uyğun olaraq həyata keçirən təcrübəli bir paketləmə komandasından istifadə edirik ki, siz ən yaxşı məhsulu əldə edəsiniz. Məhsullarınızın təhlükəsiz şəkildə təyinat yerinə çatmasını təmin etmək üçün çatdırılma prosesinin tamamını nəzarət edəcəyik. Qatlanan otaq tikinti sahəsində qaynaq işləri aparılmadan quraşdırıla bilər və quraşdırma prosesini daha səmərəli və az vaxt tələb edən şəkildə aparmaq üçün quraşdırma təlimatları da təqdim edirik. Təlimatlardakı addımlara riayət edərsinizsə, qatlanan evinizi quraşdıra biləcəksiniz. Apple kabineti, unikal forma, gözəl görünüş — evinizi daha şəxsi edir. Sadə müasir üslubdan qədim üsluba qədər müxtəlif üslub və rənglərdə təkliflərimiz var ki, şəxsi ehtiyaclarınızı ödəyə bilsin. Saxlama konteyner evləri istifadəçinin arzuları və tələbləri əsasında hazırlanmışdır. Sizə uyğunlaşdırıla bilər. Şəxsi arzularınıza və üstünlüklərinizə əsasən evinizin üslubunu, planlaşdırmasını, su və elektrik sistemini və başqalarını dəyişdirə bilərsiniz. Beləliklə, yalnız sizə xas olan mükəmməl ev yarada bilərsiniz. Elektrik və su borularını evin dekorasiyasından əvvəl quraşdırırıq; bu da dekorasiya sonrası elektrik və su borularının yenidən düzəldilməsi üçün sərf olunan vaxtı qənaət edir və dekorasiyanın effektivliyini və keyfiyyətini artırır. Daxili sahələr üçün müxtəlif planlar təklif edirik: oturma otağı və yemək otağı, yataq otaqları, mətbəx, tualet və s. Tələblərinizə və üstünlüklərinizə uyğun olaraq seçim edərək özünüz üçün mükəmməl ev yarada bilərsiniz. Keyfiyyətli həyat — Apple Evdən başlayır! Apple Ev-in unikal cazibəsini kəşf edin! CDPH müxtəlif növ modulyar ev, prefab ev və villa ev istehsal edir və satır. Üzlümlü məhsul çeşidliliyi hər injiniring kampı üçün uyğun həll təklif etməyimizi təmin edir.konteyner evləri
Saxlama konteyner evlərinin ekoloji dost mühit yaratmasında rolu.

Saxlama konteyner evlərinin unikal memarlıq və dizayn imkanlarını kəşf edin.

Minimalist həyat tərzi üçün saxlama konteyner evlərində fəzanın maksimum istifadəsi.

Hərəkətdə olanlar üçün saxlama konteyner evlərinin çoxfunksiyalılığı.
Why choose CDPH
konteyner evləri?
Yeni gələn prefabrikat ev
Yaxşı Satış konteyner evi
Yüksek keyfiyyətli çatılabilən ev
Modern stil modulyar apple ev
Əlaqəli məhsul kateqoriyaları
Axtardığınız şeyi tapmırsınız?
İndi Təklif Sorğu
Daha çox mövcud məhsullar üçün məsləhətçilərimizlə əlaqə saxlayın.Əlaqə saxlayın
27+ Illik Təcrübə
Injiniring Kampa Yığım