sady pro velkoobchodníky. Co to znamená? V...">
,需要通过父级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 (skedulerjokowi.com) výrobce, lídr na trhu sestavovacích setů pro prefabrikované domy online, nabízíme velmi levné Prefabricovaný dům sady pro velkoobchodníky. Co to znamená? Znamená to, že máme polo hotové domy, u kterých si můžete vybrat jejich vzhled! Můžete si vybrat barvy, rozmístění místností a druh použitých materiálů. Dostanete dům podle svých představ ve stylu, který vám vyhovuje, a to bez obrovských nákladů. Když si kupujete sada předem vyrobeného domu od CDPH získáváte kvalitu na nejvyšší úrovni. Při stavbě našich domů používáme nejlepší materiály a usilujeme o dokonalost v každé malé podrobnosti. To znamená, že Váš dům je pevný, vysoce kvalitní a esteticky přitažlivý. Buďte si jisti, že to, co do něj vložíte, vydrží po mnoho let. Nejrychlejší montážní doba Jednoduché a velmi atraktivní Sada předem vyrobeného domu Na praktické úrovni to znamená, že Váš dům lze postavit za zlomek času, úsilí a nákladů. Všechny potřebné součásti a návod k montáži jsou součástí našich sad, takže Váš dům bude postavený a připravený k okamžitému použití. Naše modulární sady domů jsou navrženy tak, aby nabízely pohodlná řešení pro stavbu, ať už budujete malou chatu nebo prostorný rodinný dům. V CDPH věříme v přírodu a proto nabízíme ekologické možnosti na míru sady pro prefabrikované domy . Takže si můžete pořídit stylovný a funkční dům, aniž byste poškodili planetu. Protože naše domy jsou ekologické, udržujeme alternativy nízké pomocí materiálů na bázi ekologie, solárních panelů a výrobků s označením Energy Star. Tímto způsobem nejenže dosáhnete vynikajícího domova, ale také budete pečovat o životní prostředí. CDPH poskytuje vysokou úroveň zákaznického servisu a podpory při zakoupení vašeho sada předem vyrobeného domu . Nabízíme podporu po celou dobu procesu — od výběru vašeho sestavovacího setu až po stavbu vašeho domu. Jsme jen telefonní hovor daleko, abychom odpověděli na všechny otázky nebo obavy. Pokud nebudete spokojeni, uděláme vše pro to, abychom to napravili, a zajistili, že bude váš nákupní zážitek stejně kvalitní jako naše výrobky. Prefabrikované domy jsou sestavovatelné domovní sady, které nevyžadují žádné zvláštní odborné znalosti. Jsou vhodné pro kanceláře, bydlení, skladování nebo jakýkoli jiný účel. Jablečný dům, jedinečný tvar, krásný vzhled – udělá váš domov ještě více personalizovaný. Od jednoduchého moderního stylu až po vintage nabízíme širokou škálu stylů a barev, které vyhoví vašim individuálním potřebám. Sada pro předem vyrobený dům je zaměřena na přání a požadavky uživatele. Lze ji přizpůsobit přesně vašim požadavkům. Na základě vašich osobních přání a preferencí můžete upravit styl svého domu, jeho dispozici, rozvod vody a elektřiny a mnoho dalšího – a tak vytvořit dokonalý domov, který je jedinečný právě pro vás. Elektrické a vodní rozvody jsme připravili předem, čímž se vyhnete časově náročnému přepravování rozvodů po dokončení interiéru a zároveň zvyšujete efektivitu i kvalitu výbavy. Nabízíme řadu dispozic pro váš interiér, včetně obývacího pokoje, jídelny, ložnic, kuchyně, koupelny atd. Můžete si vybrat podle svých potřeb a preferencí a postavit si tak dokonalý domov, který vám bude vyhovovat. Kvalitní život – hned od Jablečného domu! Objevte jedinečné kouzlo Jablečného domu! Zvyšte bezpečnost a pohodlí svého domova tím, že jej postavíte z kontejnerů! Všechny nosné prvky jsou vyráběny v továrnách. Pokud zvolíte vhodné rozměry, konfiguraci a design, je možné dům postavit rychle. Na základě vašich požadavků a preferencí lze několik modulů kombinovat do různých dispozic místností, čímž vznikne multifunkční životní prostor, například obývací pokoj, kuchyně nebo kompletní sady pro předem vyrobené domy. Nejdůležitější je, že naše kontejnerové domy lze snadno rozebrat i znovu složit, mají stabilní konstrukci a vynikající vlastnosti, jako je vodotěsnost, odolnost proti korozi a požáru; montáž je jednoduchá a snadná, nepotřebujete žádné odborné znalosti. Kontejnerové domy, které stavíme, jsou navrženy tak, aby vyhovovaly vašim potřebám – ať už jde o soukromý byt, dočasné kanceláře nebo skladovací prostory či jakékoli jiné využití. Nyní je ten správný čas pořídit si kontejnerový prostor a využít nižší ceny i přátelskějšího zákaznického servisu. Zlepšete svůj život pořízením kontejnerového prostoru! Skládací dům vychází z modulárního stylu tradičního domu, který lze nakonfigurovat podle vašich požadavků za účelem sériové výroby a zajištění stabilnějšího, bezpečnějšího a zabezpečenějšího životního prostředí. Místnosti lze flexibilně kombinovat tak, aby vyhovovaly různým potřebám, a proto můžete bydlet ve stavebnicích předem vyrobených domů kdekoli a kdykoli. Rychlá dodávka! Balení i doprava jsou rovněž rychlé – k balení skladací místnosti používáme profesionální balící tým podle vašich specifikací, abychom zajistili dodání produktu nejvyšší kvality. Všechny kroky dodávky budeme sledovat, abychom zaručili bezpečný a zabezpečený příjezd vašich položek do cílového místa. Skladací místnost lze instalovat bez svařování konstrukce na místě a poskytujeme instalační pokyny, které tento proces urychlí a zjednoduší. Pokud pečlivě dodržíte všechny kroky uvedené v návodu, bude montáž skládacího domu snadná. 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.sady pro prefabrikované domy
Vysoce kvalitní materiály a řemeslná provedení u každého předem vyrobeného domu ki

Rychlý a jednoduchý proces montáže pro rychlé stavební projekty

Dostupné udržitelné a ekologické možnosti v našich sadách předem vyrobených domů

Vynikající zákaznický servis a podpora pro všechny velkoobchodní odběratele
Why choose CDPH
sady pro prefabrikované domy?
Nová přírůstek prefabrikovaného domu
Moderní styl apple chatrč
Dobrý prodej kontejnerové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