desiderant. „Ascensus Domorum ex Containeribus“ nobis ostendit quod ...">
,需要通过父级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);
}
});
})();
Nullus dubium est quin hodie multae personae interessentur habere unam Deliciae Continens Domus . "Ascensus Domorum in Containeribus" ostendit nos has summas et hos containers nauticos recyclatos posse converti in aedes luxuriosas, quae nobis omni commodo et cultu fruimur quem domus communis praebet. Ictu quadam ingenii et personalisationis, haec spacia parva transmutari possunt in loca habitandi agilia et moderna, quae vitam luxuosam invitant. CDPH est perita in domibus luxuriosis e containeribus navium factis, varietatem significam modorum vivendi alternativorum praebens. Domus sunt sicutae constanter et ingeniose, mentibus conscii apposito. Eo ductu quod ex containeribus navium domus fiant, CDPH recyclat containeres navium et eos in habitacula mode et hodierna convertit, quae simul sunt iucunda et habitabilis. Unum ex praemiis habendi domum luxuosam e containeribus est pecuniae conservatio. Domus e containeribus plerumque multo magis admodum sunt comparate cum domibus vulgaribus, itaque optima electio esse possunt si domicilium parvum quaeras vel sumptus vitae minuere. Domus e containeribus etiam parum requirunt curae et durabiles sunt, quae prudentem investitionem repraesentant pro futuro. CDPH effingit domos continentis luxuriosas quae variis modis ad mensuram aptari possunt. Optiones variant a frigidis et modernis usque ad calidas et iocundas – est aliquid pro omnibus. Usus designeribus peritis CDPH, domum somnii tui super basim containerum navium effingere potes. Domus ad mensuram aptatur in dispositione, materia, et finitione. Sive moderna et minimalis rectis lineis puris et coloribus neutralibus, sive ornata et colorata, CDPH te protegit. A finitionibus qualitatis usque ad apparatus summas, CDPH pollicetur unamquamque domum continentis luxuriosam ad voluntatem singulorum et vitae accommodatam esse. Vita moderna in domo continentis luxuriosa non necesse est ut sit incómoda vel turpis. Domicilia CDPH sunt de spatio et usu; omnes functiones quas in domo regulari haberent, sed efficentius compactas. Ab arte consiliendi callida usque ad constructionem diligenter in minimis insistens, CDPH facit ut uncia quadrata quaeque optime utatur. Secundum CDPH, domus eius luxuriosae in containeribus habent tecta alta et fenestras magnas et dispositiones plani aperti, praebentes "sensum spatii ampli et aeris per omnia." Haec domus ita sunt descriptae ut luce naturali repleantur et pulchra rura prospectent ut pars interioris. Cum cubiculis commodis, culinis modernis, et balneis elegantiis, domus CDPH omnes commoditates domus luxuriosae offerunt in forma parva et sustinenda. Domus container, tuam tutelam sanciunt et vitam tuam commodiorem reddunt! Omnes domus luxuriosae ex container fabricantur in officinis. Cum idoneas mensuras, dispositionem et formam eligeris, cito tuum spatium habitandi creare potes. Propter necessitates et studia sua, diversa modula inter se iungi possunt ad varias dispositiones cubiculorum efficiendas, ut spatium habitandi multifunctionale, velut atrium, culinam et cubiculum, constituatur. Praecipuum autem est quod domus nostra ex container facile dissolvi et rursus conponi potest, stabili et robusta structura, egregiae qualitatis, quae includit proprietates impervias aquae, humori et igni; praeterea processus installationis facilis et simplicis operationis est, nullumque speciale peritiae technicae gradum postulat. Sive pro spatio privato tuo, sive pro reposito, sive pro tempore officio, sive pro aliis causis: domus nostrae praefabricatae ex container ad tuas necessitates accommodantur. Emptum iam cubiculum ex container et fruere minore pretio atque cura diligentiori! Vitam tuam meliorem fac! Casa mala, forma unica, species pulchra, quae domum tuam magis personaliter efficit. Nos varietatem colorum et styli habemus, ut necessitatibus aestheticis tuis satisfaciamus, a simplici moderno ad vetustum. Peking Chengdong in usuarius necessitatibus concentratur et ad tuas peculiares necessitates adaptari potest. Per dispositionem, distributionem electricitatis et aquae, formam, et alia luxuosa domorum ex contentoribus secundum tuas praefertiones domum tuam somniorum aedificare potes. Nos tubos pro aqua et electricitate ante aedificationem praefabricavimus, ita ut molestus processus reordinandi tubos post ornatum domus vitetur, et efficentia atque qualitas ornatus melioratae sint. Ex variis solutionibus interioris ornatus eligere potes pro salone, area cenationis, cubiculo, balneo, culina, et multis aliis. Vita bona, ex Casa Mala! Veni et experire fascinationem unici Casae Malae! Domūs praefābricātae facile coniunguntur et nōn indigent ulla scientiā speciālī. Utī possunt ut domūs luxuōsae ex continēntibus, ut officinae aut locī ad rēs servandās, aut ad quamcumque aliam causam. Domus plicabilis sequitur stilum modularis domus traditae, quae ad vestras necessitates configurari potest, ut producatio in massa efficiatur et habitatio vestra stabilior, tutior et securior fiat. Cubicula flexibiliter combinari possunt, ut variis necessitatibus satisfaciant, ita ut in domibus luxuosis ex contentoribus manere possitis ubicumque et quandoque. Cito mittitur! Impacatio et missio etiam celeres sunt; aequipe speciali impacationis utimur, quae cubiculum plicabile iuxta vestras specificas directiones impacat, ut optima qualitate productum accipiatis. Omnes processus missionis observabimus, ut res vestrae tuto et secure ad destinatum locum perveniant. Cubiculum plicabile sine structura in loco soldanda installari potest, et habemus instructiones installationis, quae totum processum celeriorem et simpliciorem reddunt. Si omnes gradus huius instructionis sequamini, facile erit compositionem domus plicabilis perficere. CDPH artificia et varias vendunt aedes modularis, Prefab domus et villa domus. Proventus amplis efficit ut apta solutio ad singula castra machinatoria nos expediat.domus Luxuosa ex Containeribus
Crescit popularitas domorum in containeribus

Luxuosa Domus e Recyclatis Containeribus Navium

Domos e Containeribus in Domicilia Luxuosa Transformare

Lectam Vitam in Spatiis Parvis amplecti
Why choose CDPH
domus Luxuosa ex Containeribus?
Bonus Sales continens domum
Modern Style malum Cameram
Novus advenil prefab domum
Princeps qualis tenens domum
Categories Producti Relatae
Non invenis quod quaeris?
Petere Citatio Nunc
Consulere nostros pro magis productis disponibilibus.Cum Nobis Contacata
27+ annos Usus
Engineering Castra Construction