chất lượng cao">
,需要通过父级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);
}
});
})();
Bạn có cần một giải pháp thông minh để bố trí chỗ ở cho công nhân tại các công trường hay khu trại không? Công ty chúng tôi, CDPH, cung cấp các tòa nhà chất lượng cao nhà tiền chế cho khu nhà trọ công nhân . Không chỉ vậy, ngôi nhà này còn hợp lý và chi phí thấp, đồng thời cũng có thể được sử dụng làm nhà ở cho công nhân. Tại CDPH, chúng tôi hỗ trợ cải thiện điều kiện nhà ở chất lượng cho người lao động. Công ty chúng tôi nhà sẵn sàng được xây dựng bằng vật liệu tốt và đảm bảo sự thoải mái cũng như an toàn. Mỗi ngôi nhà đều có các tiện nghi cơ bản và có thể chống chịu được thời tiết. Trong điều kiện nắng nóng khắc nghiệt hoặc mưa to, những ngôi nhà của chúng tôi mang đến cho họ một nơi để nghỉ ngơi thoải mái, tránh xa những vất vả sau một ngày làm việc mệt nhọc. Và nếu bạn muốn mua nhiều nhà lắp ghép cùng một lúc, CDPH cũng có chương trình ưu đãi đặc biệt dành cho khách hàng mua sỉ. Các mức giá thấp của chúng tôi luôn đảm bảo chất lượng và có thể điều chỉnh phù hợp với ngân sách của bạn. Bạn sẽ có lợi, bởi vì khi chọn nhà lắp ghép của chúng tôi, bạn tiết kiệm được tiền do giảm thiểu chi phí vật liệu xây dựng truyền thống và chi phí nhân công. Chúng tôi nhận thức rằng mỗi khu nhà trọ công nhân đều có những yêu cầu riêng biệt. Vì vậy, CDPH cung cấp các lựa chọn được thiết kế riêng để đáp ứng nhu cầu đặc thù của bạn. Dù bạn đang tìm kiếm không gian lớn hơn để tổ chức tiệc tùng hay một không gian sống nhỏ gọn hơn, chúng tôi có thể tạo ra nhiều lựa chọn khác nhau dựa trên mong ước, ý tưởng của bạn và quy mô gia đình bạn. Chúng tôi hợp tác chặt chẽ với khách hàng để thiết kế theo yêu cầu mọi khía cạnh, nhằm đảm bảo người lao động được trải nghiệm điều kiện sống tốt nhất có thể. Một trong những lợi ích lớn nhất khi nói đến nhà lắp ghép của chúng tôi là khả năng thi công nhanh chóng và dễ dàng! Các ngôi nhà tiền chế của chúng tôi sử dụng công nghệ xây dựng hiện đại, có thể được lắp ráp chỉ trong vài ngày. Việc lắp đặt nhanh chóng này giúp tiết kiệm thời gian cho bạn, chưa kể đến việc bạn có thể huy động đội ngũ công nhân vào làm việc sớm hơn. Các chuyên gia của chúng tôi sẽ chịu trách nhiệm toàn bộ quá trình lắp đặt, mang đến cho bạn trải nghiệm thuận tiện, không phiền hà, khi bạn sẽ nhận được những ngôi nhà sẵn sàng để ở trong thời gian ngắn. Chúng tôi coi trọng tính bền vững tại CDPH. Các ngôi nhà sẵn có của chúng tôi được xây dựng từ những vật liệu chắc chắn và bền bỉ, có thể chịu đựng được hơn cả những điều kiện thời tiết khắc nghiệt. Khi bạn chọn sản phẩm đã được lắp ráp sẵn của chúng tôi, bạn có thể yên tâm rằng mình đang thực hiện một lựa chọn bền vững, giúp giảm thiểu chất thải và tác động thấp hơn đến môi trường. Những ngôi nhà này có chức năng sử dụng và có thể vận chuyển để tái sử dụng, mang lại sự linh hoạt và giảm tiêu thụ vật liệu mới. Ngôi nhà gấp được xây dựng theo tiêu chuẩn mô-đun, có thể sắp xếp linh hoạt tùy theo yêu cầu của khu nhà ở công nhân tiền chế của bạn. Điều này cho phép sản xuất hàng loạt và làm cho ngôi nhà của bạn an toàn, ổn định và đáng tin cậy hơn. Ngoài ra, không gian có thể được kết hợp linh hoạt để đáp ứng các nhu cầu sử dụng khác nhau, giúp bạn có trải nghiệm sống thoải mái bất cứ lúc nào và ở bất kỳ đâu. Giao hàng nhanh! Việc giao hàng và đóng gói diễn ra cực kỳ nhanh chóng. Chúng tôi có đội ngũ đóng gói chuyên nghiệp thực hiện theo đúng yêu cầu kỹ thuật của bạn khi đóng gói phòng gấp, đảm bảo bạn nhận được sản phẩm tốt nhất. Chúng tôi sẽ giám sát từng bước trong quá trình vận chuyển để đảm bảo hàng hóa đến đích một cách an toàn. Đây cũng là lựa chọn tiện lợi nhất, vì căn phòng dễ dàng lắp ráp mà không cần hàn tại công trường, và chúng tôi cung cấp hướng dẫn lắp đặt để việc thi công của bạn trở nên dễ dàng và nhanh chóng hơn. Nếu bạn làm theo hướng dẫn của chúng tôi, việc lắp đặt ngôi nhà gấp sẽ rất đơn giản. Hãy làm cho ngôi nhà của bạn an toàn và thoải mái hơn bằng cách lắp đặt một ngôi nhà container! Tất cả các thành phần cấu trúc đều được sản xuất sẵn trong nhà máy. Bằng cách lựa chọn kích thước, bố trí và phong cách phù hợp, bạn có thể nhanh chóng tạo ra không gian sống của mình. Theo nhu cầu và sở thích, nhiều module có thể được kết hợp thành các bố cục phòng khác nhau để tạo nên một ngôi nhà tiền chế đa chức năng, như phòng khách, nhà bếp hoặc phòng ngủ. Điều quan trọng nhất cần lưu ý là ngôi nhà container mà chúng tôi sử dụng dễ dàng tháo lắp, có cấu trúc chắc chắn, hiệu suất vượt trội như chống thấm nước, chống cháy và quá trình lắp đặt đơn giản, dễ thực hiện, không yêu cầu chuyên môn kỹ thuật đặc biệt. Dù cho mục đích sinh hoạt cá nhân, lưu trữ, văn phòng tạm thời hay các mục đích khác, những ngôi nhà container tiền chế đều được thiết kế để đáp ứng yêu cầu của bạn. Hãy tận dụng ngay một căn phòng container hôm nay, hưởng mức giá tốt hơn và dịch vụ tốt hơn. Nâng cao chất lượng cuộc sống của bạn! Cabin Apple, hình dáng độc đáo, ngoại hình đẹp mắt, giúp ngôi nhà của bạn trở nên cá tính hơn. Từ phong cách hiện đại đơn giản đến cổ điển, chúng tôi cung cấp đa dạng kiểu dáng và màu sắc để đáp ứng nhu cầu cá nhân của bạn. Khu nhà ở công trường lắp ghép tập trung vào mong muốn và yêu cầu của người dùng. Nó có thể được tùy chỉnh theo yêu cầu của bạn. Dựa trên mong ước và sở thích cá nhân, bạn có thể thay đổi kiểu dáng ngôi nhà, bố trí mặt bằng, hệ thống nước và điện, v.v. Để tạo nên một ngôi nhà hoàn hảo, độc nhất vô nhị dành riêng cho bạn. Chúng tôi đã xây dựng sẵn hệ thống đường điện và ống dẫn nước từ trước, giúp tránh được việc tốn thời gian sắp xếp lại hệ thống điện nước sau khi trang trí nhà cửa, đồng thời nâng cao hiệu quả và chất lượng thi công nội thất. Chúng tôi cung cấp nhiều lựa chọn bố trí nội thất, bao gồm phòng khách và phòng ăn, phòng ngủ, nhà bếp, phòng tắm, v.v. Bạn có thể lựa chọn tùy theo nhu cầu và sở thích cá nhân để kiến tạo nên ngôi nhà lý tưởng cho mình. Chất lượng cuộc sống, bắt đầu ngay từ Apple House! Khám phá sức hút độc đáo của Apple House! Khu nhà trại lao động nhà tiền chế được thiết kế độc đáo nhằm tăng cường độ bền kết cấu và có khả năng chống động đất tốt, đảm bảo an toàn. Thiết kế dạng mô-đun, dễ dàng vận chuyển, việc lắp đặt có thể điều chỉnh theo sở thích cá nhân với nhiều phong cách và loại phòng khác nhau. Tất cả các thành phần đều làm từ vật liệu tiền chế và dễ dàng lắp ráp, không yêu cầu kỹ năng đặc biệt. Dù sử dụng làm khu vực sinh hoạt, văn phòng, kho chứa hay các mục đích khác, ngôi nhà tiền chế đều đáp ứng được nhu cầu của bạn. Ngoại thất hiện đại, đường nét tinh tế, có thể tùy biến theo sở thích cá nhân để tạo nên không gian sống độc đáo. Đặc biệt hơn, các ngôi nhà tiền chế không cần hàn tại chỗ, đồng thời chúng tôi sẽ cung cấp hướng dẫn lắp đặt để quá trình thi công của bạn trở nên đơn giản và nhanh chóng hơn. Hãy tận hưởng cuộc sống tuyệt vời nhất và lựa chọn nhà tiền chế Chengdong. CDPH sản xuất và bán nhiều loại nhà mô-đun, nhà tiền chế và nhà biệt thự. Phạm vi rộng rãi của sản phẩm đảm bảo chúng tôi cung cấp giải pháp phù hợp cho mỗi trại công trình.Nhà lắp ghép cho khu nhà trọ công nhân
Giải pháp tiết kiệm chi phí cho người mua sỉ

Tùy chọn tùy chỉnh để đáp ứng nhu cầu của bạn

Quy trình lắp đặt nhanh chóng và hiệu quả

Vật liệu xây dựng bền vững và lâu dài
Why choose CDPH
Nhà lắp ghép cho khu nhà trọ công nhân?
Nhà gập chất lượng cao
Container nhà bán chạy
Kiểu dáng hiện đại nhà cabin táo
Sản phẩm mới nhà tiền chế
Danh Mục Sản Phẩm Liên Quan
Không Tìm Thấy Thứ Bạn Đang Tìm?
Yêu Cầu Báo Giá Ngay
Liên hệ với các chuyên gia tư vấn của chúng tôi để biết thêm sản phẩm có sẵn.Liên hệ với chúng tôi
27+ Năm Kinh Nghiệm
Xây dựng Trại Công trình