ay maaaring gamitin para sa iba't ibang uri ng...">
,需要通过父级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);
}
});
})();
Kailangan mo ba ng Sukat ng Metal na Gusali na Hindi Nakalista? Ang aming 50x100 metal building maaaring gamitin para sa iba't ibang uri ng proyekto at gawain. Ang mga istrukturang ito ay may malawak na aplikasyon kabilang ang malalaking warehouse, pabrika, at napakalaking workshop. Talakayin natin ang mga detalye at alamin kung bakit ang aming 50x100 metal buildings ay mainam para sa mga wholesale customer tulad mo! Dito sa CDPH, alam namin na ang badyet at katatagan ay mahahalagang salik din kapag mamumuhunan sa isang bagong gusali. Kaya ang aming 50x100 metal building ay ginawa gamit ang mga materyales ng napakataas na kalidad upang tumagal nang buong buhay. Hindi nila ito mapapansin ang panahon at pagkasuot, kaya hindi kayo gagastos ng malaki para sa pagpapanatili nito. Higit pa rito, maaari naming ibenta sa inyo ang mga gusaling ito sa presyong whole sale, na nagiging murang solusyon para sa inyong negosyo. Nakakamit ninyo ang matibay at matagal nang istraktura nang hindi nabubugbog. Mga Ideya sa Disenyo Planuhin ang Iyong 50x100 Prefab Metal Building Gamit ang Aming Suporta Tumawag Ngayon: 01274 518171 I-customize ang Iyong 50x100 steel building Para Mag-order o Para sa Anumang Impormasyon, Tumawag sa amin sa 01274 518171 Ang isang 50×100 Metal Building ay isang sikat na sukat ng espasyo, na nagbibigay-daan sa amin na lumikha ng custom na disenyo na may maraming opsyon. Hindi lahat ng kaso ay pareho, at nauunawaan ito ng CDPH. Ang aming 50×100 steel building ay isa sa aming pinakamaraming gamit at sikat na sukat. Kung kailangan mo ng mas maraming bintana, pasadyang pinto o tiyak na layout sa loob, maisasagawa ito batay sa iyong hiling. Kasama ka namin sa bawat hakbang upang makabuo ng gusali na hindi lamang tugma sa iyong pangangailangan kundi lalampas pa sa iyong inaasahan, parehong disenyo at serbisyo. Alam naming ang oras ay pera. Kaya binibigyang-pansin ng CDPH ang mabilis na pagpapadala at pagtaas ng iyong 50x100 metal building . Gumagawa kami nang mabilis hangga't maaari sa proseso ng paggawa upang mapalagay at mapakinabangan agad ang iyong bagong gusali. Ang aming mahusay na proseso ay nagbibigay-daan sa iyo na magamit ang iyong bagong espasyo nang walang pagkaantala upang bawasan ang down time at patuloy na maayos na takbo ng iyong operasyon. Disenyo at Gawa ng Iyong 50 x 100 Metal Building na may Magandang Presyo at Kalidad Runyon and SonsBuilders of the Best 50 x 100 Steel Buildings Offering A Wide Range of 50x100 Metal Building Options peace-of-mindOur 50x100 steel building nag-aalok ng humigit-kumulang 5,000 sq ft na protektadong, ligtas na espasyo para sa imbakan na nagdaragdag ng ekstrang square footage sa iyong ari-arian. Ang aming mga gusaling 50-hanggang-100 ay hindi malalaking walang laman na istruktura. Idinisenyo ang mga ito na may matalinong mga tampok na nakakatipid ng espasyo. Walang panloob na haligi sa disenyo ng clear-span ng mga silid, na nagbibigay-daan sa iyo na gamitin ang bawat pulgadang kuwadrado. Angkop ito para sa malaking kagamitan o pagkakaayos ng assembly line. Higit pa rito, idinisenyo ang aming mga gusali na may modernong pakiramdam upang magmukhang maganda at magbigay sa lahat ng mahusay na lugar para trabahan. Mga bahay na gawa sa kontainer: tiyakin ang inyong kaligtasan at gawin ang inyong buhay na mas komportable! Ang lahat ng metal na gusali na may sukat na 50x100 ay ginagawa sa mga pabrika. Kapag pinili ninyo ang angkop na sukat, konpigurasyon, at disenyo, maaari ninyong mabilis na likhain ang inyong espasyo para sa pananahanan. Ayon sa inyong mga pangangailangan at kagustuhan, maaaring pagsamahin ang iba’t ibang mga module upang makabuo ng iba’t ibang layout ng kuwarto—upang lumikha ng multi-functional na espasyo para sa pananahanan tulad ng living room, kusina, at silid-tulugan. Ang pinakamahalagang aspeto ay ang aming bahay na gawa sa kontainer ay madaling i-disassemble at i-reassemble, may matatag at malakas na konstruksyon, mataas ang kalidad, kasama ang waterproof, moisture-proof, at fire prevention; ang proseso ng pag-install ay madali at simple gamitin, at hindi nangangailangan ng anumang espesyal na antas ng teknikal na kasanayan. Kung ito ay para sa inyong personal na espasyo, imbakan, pansamantalang opisina, o iba pang dahilan—ang aming mga prefab na bahay na gawa sa kontainer ay idinisenyo upang tumugma sa inyong mga kinakailangan. Bumili na ng box room ngayon at tamasahin ang mas mababang gastos at mas maingat na serbisyo—gawin ang inyong karanasan sa pananahanan na mas maginhawa! 50x100 na gusali na yari sa metal, may natatanging hugis at magandang anyo—ginagawa nitong mas personal ang iyong tahanan. Mula sa simpleng moderno hanggang sa vintage, nag-ooffer kami ng iba’t ibang istilo at kulay na sumasalamin sa iyong panlasa at kagustuhan. Ang Beijing Chengdong ay nakatuon sa mga pangangailangan ng mga gumagamit at maaaring i-customize upang tugunan ang iyong tiyak na kailangan. Maaari mong idisenyo ang iyong pangarap na tahanan sa pamamagitan ng pagbabago sa layout, distribusyon ng tubig at kuryente, hugis, at iba pang katangian batay sa iyong personal na kagustuhan. Ang pre-fabrication ng mga linya ng kuryente at tubig ay tumutulong sa amin na maiwasan ang mahabang proseso ng pag-uulit ng pagkakalagay ng mga tubo kapag na-decorate na ang bahay, na nagpapataas ng kalidad at kahusayan ng dekorasyon. Nag-ooffer kami ng malawak na hanay ng mga opsyon para sa loob na layout na kasama ang living room, dining room, bedroom, kitchen, bathroom, atbp. Maaari mong piliin ang mga ito batay sa iyong kagustuhan at panlasa upang lumikha ng isang ideal at natatanging tahanan para sa iyo. Apple House – Kalidad ng pamumuhay sa pinakamataas na antas! Ang Apple House ay isang natatanging lugar! Ang pre-fabricated na bahay ay may tiyak na disenyo para sa kahusayan ng istruktura at kakayahang magbigay ng mabuting pagganap laban sa lindol upang matiyak ang kaligtasan. Modular ang disenyo, madaling dalhin, at ang pag-install ay maaaring i-adapt batay sa personal na panlasa sa iba't ibang istilo at uri ng silid. Lahat ng bahagi ay pre-fabricated at madaling ilagay sa posisyon nang walang kailangang espesyal na kasanayan. Kung ito man ay para sa opisina, tirahan, imbakan, o iba pang sitwasyon, ang mga pre-fabricated na bahay ay kayang tugunan ang iyong mga pangangailangan. Ang 50x100 na metal na gusali ay may malalim na linya at maaaring i-customize ayon sa iyong personal na panlasa upang lumikha ng natatanging espasyo para sa pamumuhay. Pinakamahusay sa lahat, ang mga pre-fabricated na bahay ay hindi nangangailangan ng welding sa lugar, at nag-ooffer kami ng mga tagubilin para sa pag-install upang gawing mas simple at mas mabilis ang proseso. Tangkilikin ang isang mas mahusay na buhay sa pamamagitan ng pagpili sa mga pre-fabricated na bahay ng Chengdong. Ang folding house ay sumusunod sa isang metal na gusali na may sukat na 50x100 na maaaring ayusin ayon sa iyong mga pangangailangan upang mapataas ang produksyon at gawing mas ligtas, matatag, at maaasahan ang iyong tirahan. Ang kuwarto ay maaaring iayos sa paraan na kayang kumupkop sa iba't ibang pangangailangan, nangangahulugan ito na magiging komportable ka man di-iriwan kailanman. Mabilis na paghahatid! Napakabilis ng pagpapadala at pagpapacking. Mayroon kaming dalubhasang koponan sa pagpapacking na sumusunod sa iyong mga detalye upang maipadala ang folding room nang may pinakamataas na kalidad. Sinusubaybayan namin ang lahat ng proseso ng paghahatid upang tiyakin na ligtas na makakarating ang iyong mga produkto sa destinasyon. Pinakamahalaga, madaling mai-install ang folding room nang walang pangangailangan para sa welding sa lugar, at nagbibigay kami ng gabay sa pag-install upang mapabilis at mapadali ang proseso ng pagmoun. Kung susundin mo ang mga tagubilin, madali mong maibabakod ang foldable home. Ang CDPH ay nagmamaneho at nagbebenta ng iba't ibang uri ng modular na bahay, prefab na bahay at villa house. Ang malawak na saklaw ng mga produkto ay nagpapatakbo sa amin upang magbigay ngkoponente solusyon para sa bawat engineering camp.50x100 metal building
I-customize ang Iyong 50x100 Metal Building gamit ang aming Nangungunang Serbisyong Pangkalidad

Mabilis na Pagpapadala at Instalasyon para sa Iyong 50x100 Metal Building Naipon

Higit na Mahusay na Disenyo at Tungkulin sa Aming Mga Napiling 50x100 Metal Building

Mag-iba sa Merkado Gamit ang Aming mga Solusyon para sa 50x100 Metal Building
Why choose CDPH
50x100 metal building?
Mabuting Benta ng container house
Modern Style apple cabin
Bagong dating prefab house
Mataas na kalidad na bahay na maaaring mag-fold
Mga kaugnay na kategorya ng produkto
Hindi makahanap ng hinahanap?
Humiling ng Quote Ngayon
Makipag-ugnay sa aming mga konsultant para sa iba pang mga produkto.Makipag-ugnayan
27+ Taon Ng Kagandahang-loob
Pagtatayo ng Engineering Camp