&...">
,需要通过父级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);
}
});
})();
또한, 신중하게 설계된 큰 컨테이너 홈에 거주하길 원하신다면 그것이 당신에게 적합할 것입니다. 이들은 ZYC입니다 모듈형 컨테이너 주택 , 전 세계적으로 물품을 운반하기 위해 사용되는 큰 금속 상자입니다. 이러한 컨테이너를 주택으로 변환하면 폐기물 재활용에 도움을 줄 뿐만 아니라 더 환경적으로 지속 가능한 거주 공간을 건설할 수 있습니다. 따라서 우리는 단순히 집을 짓는 것이 아니라, 지구를 생각하며 집을 짓고 있는 것입니다. 큰 컨테이너 홈에 거주하기로 선택할 때, 당신은 환경 친화적인 생활 방식을 선택하는 것입니다. 이는 우리가 폐기물로 버려질 수 있는 재료를 재활용하기 때문입니다. 쓰레기가 버려지는 곳인 매립지들은 환경을 파괴할 수 있습니다. 또한 컨테이너 홈은 매우 높은 에너지 효율성을 가지고 있습니다. 이를 통해 겨울에는 따뜻한 실내 온도를 유지하고 여름에는 시원하게 유지하면서 에너지를 절약할 수 있습니다. 그들은 훌륭한 단열체이며 태양광 패널을 쉽게 설치할 수 있습니다. 태양광 패널은 태양빛을 흡수하여 에너지로 변환하는 기계로, 다른 에너지원의 사용량을 줄일 수 있게 해줍니다. 새로운 큰 컨테이너 홈은 지구와 연결되어 탄소 배출량을 줄이는 데 도움을 줄 수 있으며 실제로 중요한 환경 보호 역할을 합니다. 탄소 발자국은 우리가 배출하는 이산화탄소의 양을 의미하며, 이를 줄이는 것은 기후 변화와 싸우는 방법 중 하나입니다. 대형 컨테이너 홈의 디자인은 시원하고 다용도로 활용 가능합니다. 이러한 집들은 귀하의 요구 사항에 맞춰 건축됩니다. 예를 들어, 자신을 위한 한 개의 침실로 이루어진 아늑한 공간이나 가족을 위한 큰 집을 선호할 수 있습니다. 컨테이너의 금속 벽은 잘리고 재배치될 수 있어 오픈형 생활 공간을 만들 수 있습니다. 이는 풍부한 자연 채광이 큰 창문을 통해 들어오게 하여 내부를 밝고 즐거운 분위기로 만듭니다. 약간의 상상력만으로 대형 컨테이너 홈을 매일 돌아가고 싶어질 만큼 세련되고 아늑한 집으로 바꿀 수 있습니다. 이러한 분위기와 노출된 보들로 이루어진 금속 외관은 대형 컨테이너 홈의 몇 가지 독특한 특징입니다. ZYC 전조 컨테이너 주택 현대적인 디자인을 가지고 있어 많은 현대 건축물 애호가들이 선호하는 트렌디하고 도시적인 느낌을 준다. 그러나 이들 주택이 현대적으로 보이는다고 해서 따뜻함과 아늑함이 부족한 것은 아니다. 적절한 장식과 가구를 사용하면 초대형 컨테이너 주택도 전통적인 집처럼 느껴질 수 있다. 밝은 베개, 아늑한 담요 및 다양한 액세서리를 추가하여 공간을 친근하고 집 같은 분위기로 만들 수 있다. 대형 컨테이너 주택에서 살기는 완전히 새로운 방식으로 삶을 체험하고 집의 모든 편의 시설을 즐길 수 있는 놀라운 방법이다. 대형 컨테이너 하우스에서의 새로운 현대적 생활: 이 ZYC 事전 제작된 컨테이너 주택 일반 주택에서 찾을 수 있는 모든 편의 시설, 주방, 욕실, 침실 등을 갖추고 있습니다. 이를 통해 맛있는 음식을 만들고, 오랜 시간 거품 목욕을 즐기며, 밤에는 따뜻하고 쾌적한 방에서 머무를 수 있습니다. 상상력을 발휘하면 옥상 정원을 만들어 꽃이나 식물을 심거나, 야외에서 휴식을 취할 수 있는 데크나 여름 더위를 날릴 수 있는 수영장 같은 재미있는 기능도 추가할 수 있습니다. 크기가 작기 때문에 컨테이너는 당신으로 하여금 소유물에 대해 생각하고 간단하게 살아가게 만듭니다. 또한 집을 깔끔히 유지하고 삶을 정리하여 더욱 조직적이고 평화로운 느낌을 받을 수 있도록 해줍니다. 우리는 스타일리시하고 넓은 공간의 ZYC를 개발하고 건설합니다. 폴더블 컨테이너 주택은 매우 지속 가능합니다. . 풍부한 경험을 바탕으로 꿈의 집 설계를 현실로 만들어 온 우리 전념된 건축가들과 디자이너들은 고객들과 협력하여 모든 주택이 그들의 특정 필요와 생활 방식에 맞게 조정되도록 합니다. 작은 아늑한 휴양지에 접근하고 싶든, 친구와 가족과 시간을 보내기 위한 크고 호화로운 집이든 상관없이 우리는 당신의 꿈을 현실로 만들어 드릴 수 있습니다. 우리는 모두 자신이 누구인지, 무엇을 소중히 여기는지를 반영하는 집에 살 자격이 있다고 믿습니다. 회사의 기술자들은 3차원 설계 소프트웨어를 숙달하여 신속하고 정확하게 3차원 모델을 구축하고, 설계 의도를 직관적으로 표현하며 고객에게 만족스러운 3차원 개념 도면과 렌더링을 제공할 수 있습니다. 회사는 약 4,000평방미터의 현대적인 표준 공장과 야드를 보유하고 있으며, 다양한 전문 생산 장비와 기술 작업자들이 있어 풍부한 경험, 높은 생산 효율성, 그리고 제품 품질을 보장합니다. 우리 설립맴버 및 주주들은 자본력이 풍부한 국내 올드 컨테이너 회사를 소유하고 있습니다. 이 회사는 모듈식, 데이터 기반, 효율적인 사과 저장고, 확장 박스, 우주 캡슐 컨테이너 및 특수 장비 박스에 대한 연구 개발, 디자인, 생산, 맞춤형 인테리어, 설치 또는 원격 가이드를 제공하는 일괄 서비스에 전념하고 있습니다. 우리 전문 기술자는 건축공학, 기계공학 등 여러 공학 전공 출신으로 구조력 분석, 3D 모델링, 그리고 다학제적이고 교차 학문적인 연구 개발 및 설계에서 강점을 가지고 있습니다. Copyright © ZYC Material Technology Co., Ltd. All Rights Reserved - 개인정보 보호정책큰 컨테이너 홈
대형 컨테이너 홈의 설계에서 효율성이 혁신과 만난다

대형 컨테이너 홈 거주 공간의 독특한 매력을 발견하세요

현대 생활을 위한 대형 컨테이너 홈의 잠재력을 해제하십시오

스タイ리시하고 넉넉한 대형 컨테이너 홈으로 변신하는 선박용 컨테이너
Why choose ZYC
큰 컨테이너 홈?
빠르고 정확한 3D 모델링 능력
엄격한 품질 관리로 이루어지는 고효율 생산
모듈러 주택 솔루션을 위한 포괄적인 맞춤화
다학제적 공학 및 설계 전문성
원하는 내용을 찾지 못하셨나요?
지금 견적 요청하기
더 많은 이용 가능한 제품은 전문가와 상담해 주세요.문의하기