може би е точно това, което ви трябва...">
,需要通过父级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 къща в Нуза? Ако сте мислели за това, то разтеглив дом може би е точно нещото за вас! Тези къщи са по-малки от обикновените, но това означава, че могат също така да са много по-евтини. Заради това също ясно е, че можете да придобиете собствена къща без да отдадете или да стартирате голяма сума. Това напълно обяснява защо малката къща може да е perfектния компромис, тъй като е по-евтино да се построи и същевременно имате своето място за живеене според модерните стандарти Една от привилегийите на мини къщите CDPH е, че те са вашият холст. Това сте вие, които трябва да изберете размера на вашия дом, фасадите и доплата. Имате възможност да изберете материалите при налични много опции, като зависи дали искате да добавите прозорец, който пуска тонсъм слънце или да създадете малък ъгъл, предназначен само за четене. Можете също да посочите външния вид, в този случай боя или стил на вратата. Повече от това, продава се свиваем дом така че това означава, че не трябва да чакате строители да завършат строежа на вашия дом, увеличавайки своята печалба. Влизайте веднага, така че да започнете да се расслабявате или да се забавлявате, щом средата ви Мини къщи CDPH, както казаха, и това е съвсем вярно. Те са и екологично приязни: Сгъваема контейнерна къща Понеже те са направени по начин, който функционира по-енергоемко и по-спасяваш на ресурсите; поддържайки Земята здрава. Енергиен разход: Една от най-очевидните предимства при живеене в малка къща е колко малко струва да я отопляваш и охлаждаш, независимо къде това е... и също така ви позволява да улеснете процеса чрез намаляване на загубите – което наистина е начин за спасяване на тази планета! Повече от това, тези къщи са построени от екологично чисти материали. Връзка с живеене в малка къща е, че по този начин можете да кажете част от околната среда, приятно за нас. CDPH Малките къщи стават все по-популярни всеки ден. Тези къщи са модни. Има толкова много хора, които искат да живеят по-прост живот и дори повече, които правят своята част за земята. събираем Предварително Сготвен Дом предлагайки ги цялостно. Те не само са икономически ефективни и екологично приязни, но доставят повече стойност за радостта от живота. Да имате по-малко неща за да се набива в домовното си положение или едва ли няколко други неща в дишането ще ви позволи да заплатите подходящо внимание на дома и приятели. Очевидно, малките къщи са повече от просто мода, те представляват начина, по който много хора искат да живеят. Живеене в малка къща CDPH не е само за размера й, това е синоним на простиот и добър за света. Чимката неща, които притежавате, толкова по-лесно е да поддържате чист и организиран дом. Това започва от правенето на необходимото и пазенето му реално в живота ви извън работата, което ще ви позволи да обърнете повече внимание на това, което трябва/трябва да важи - време с семейството/приятелите и нещата, които ще ви накарат да се усмихвате всеки ден. Живеене в малко в къщи складаеми не е за това да се задоволите с малко или да компрометирате домакинството си, а повече за избора на висок стандарт на живеене и намиране на щастие в рамките на домакинството. И този избор принася щастие и лекост в живота му/ѝ Ябълкова къща, уникална форма, красив външен вид, направете дома си по-персонализиран. Предлагаме разнообразие от стилове и цветове, които да отговарят на вашите лични предпочитания – от прости съвременни до традиционни. Beijing Chengdong се специализира в предварително изработени малки къщи, които могат да бъдат персонализирани според вашите нужди. За да отговаря напълно на индивидуалните ви желания и предпочитания, можете да персонализирате дизайна на къщата си, интериорната компоновка, водопровод и електричество и др., за да създадете идеалния, ексклузивен дом за себе си. Електрическите и водопроводните тръби са проектирани и монтирани още преди строителството, като по този начин се избягва времехубещото преустройване на тръбопроводите след завършване на интериора, което повишава ефективността и качеството на ремонта. Можете да изберете от голям асортимент решения за интериорен дизайн за дневната, трапезарията, спалнята, кухнята и много други помещения. Качествен живот започва от Ябълковата къща! Ябълковата къща е уникален район! Предфабрикираната къща има специфично структурно проектиране и осигурява добри предварително изработени мини къщи за гарантиране на безопасността. Модулно проектиране и лесен транспорт, инсталиране, което може да се персонализира според вашите лични предпочитания относно различни стилове, типове стаи. Всички компоненти са предварително изработени и лесни за монтиране, без нужда от специални умения. Независимо дали е предназначена за офис, живеене, складиране или други ситуации, предфабрикираната къща може да отговори на вашите нужди. Стилен външен вид, изящни линии и възможност за персонализация според вашите предпочитания, за да създадете уникално жилищно пространство. Най-важното е, че предфабрикираните къщи не изискват заваряване на строителната площадка и ние също предоставяме инструкции за инсталиране, за да направим процеса на монтаж по-лесен и по-бърз. Приемете по-добър начин на живот с предфабрикуваните къщи на Chengdong. Предфабрикувани къщи Chengdong. Направете дома си по-безопасен и комфортен, като инсталирате къща в контейнер! Всички структурни компоненти се произвеждат предварително във фабрика. Като изберете подходящите размери, конфигурация и стил, можете бързо да създадете пространството си за живеене. В зависимост от нуждите и предпочитанията си, могат да бъдат включени няколко модула в различни планировки на помещения, за да се получи мултифункционални предварително изработени малки къщи като дневна, кухня или спалня. Най-важното, което трябва да се отбележи, е че използваната от нас къща в контейнер е лесна за демонтиране и сглобяване, с якостна конструкция, превъзходни характеристики като водонепропускливост, защита срещу вода, пожар и процесът на инсталиране е лесен и прост за управление и не изисква специални технически познания. За лично живеене, складиране, временно офис пространство или други цели, предварително изработените къщи в контейнери са проектирани да отговарят на вашите изисквания. Възползвайте се днес от стая в кашон, насладете се на по-добра цена и по-добро обслужване. Подобрете живота си! Сгъваемата къща следва концепцията на предварително изработени миниатюрни жилища, които могат да бъдат подредени според вашите изисквания, за да се увеличи производството и да се направи жилищното пространство по-сигурно, стабилно и надеждно. Помещението може да бъде организирано по начин, който отговаря на различни нужди, което означава, че можете да се чувствате комфортно навсякъде и по всяко време. Бърза доставка! Пратката и опаковането са изключително бързи. Използваме квалифициран екип за опаковане според вашите спецификации, за да опакова сгъваемото помещение, така че да получите продукт от най-високо качество. Ние наблюдаваме всички процеси на доставка, за да се уверим, че стоките ви достигнат дестинацията си безопасно. Най-важното е, че сгъваемото помещение е лесно за монтиране, без необходимост от заваряване на място, и ние предоставяме инструкции за монтаж, за да направим процеса по-бърз и по-лесен. Ако последвате инструкциите, лесно ще успеете да сглобите сгъваемата къща. CDPH произвежда и продава различни видове модулни къщи, Prefab къщи и Villa къщи. Широкият асортимент ни гарантира да предоставяме подходящо решение за всеки инженерен табор.Префабрикувани мини къщи
Персонализацията и удобството се срещат в префабрикуваните мини къщи

Ефективността и устойчивостта на мини къщите

Бъдещето на жилищното строителство? Растящата популярност на префабрикуваните мини къщи

Компактно живеене за устойчив и минималистичен начин на живот
Why choose CDPH
Префабрикувани мини къщи?
Модерен стил apple кабина
Нов пристигнал префабрикан дом
Добър Продажби контейнерен дом
Висококачествена складна къща
Подобни продуктови категории
Не намирате това, което търсите?
Поискайте оферта сега
Свържете се с консултантите ни за още налични продукти.Свържете се с нас
27+ Години Опит
Строителство на инженерен табор