ay ang l...">
,需要通过父级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);
}
});
})();
Narinig mo ba ang shipping container homes? Ang Container House ay isang kumikiling na bahay na gawa sa container. Ang mga ito konteiner na Balay ang malalaking mga metal na konteyner kung saan maaaring ipadala ang mga produkto sa pamamagitan ng barko at riles. Sa kamakailan, dumami ang popularidad nila, dahil ang gastos para sa paggawa nila ay maaaring mas mababa kaysa sa isang konventional na bahay. Sinabi na, hindi laging magiging murang magbuhos ng konteyner na bahay kaysa sa una mong inisyal na pag-iisip. Maraming mga factor ang nakakaapekto sa kabuuan ng gastos para sa pagsasaayos ng iyong konteyner na bahay. Halimbawa, saang direksyon gusto mong patungo ang iyong bahay? Gusto mo bang maraming silid o kaunti? Halimbawa, anong mga katangian ang gusto mong ilagay; isang malaking kusina o magandang banyo? Gaano kadakuhan ang pakikipag-ugnayan na gusto mo o kaya may potensyal na benepisyo ang pag-uwi ng iba pang kompanya? Bawat isa sa mga pilihan na ito ay magdedemograpiko sa presyo kung saan matatapos ang iyong konteyner na bahay. Ang desisyon kung mas murang magkaroon ng bahay na gawa sa konteypo kaysa sa pangkalahatang bahay ay maaaring mula sa kung ano ang hinahanap mo sa isang estilo ng pamumuhay. Ang unang-gastong mga gastos para sa mga bahay na gawa sa konteypo ay maaaring mas mababa, subalit ang mga bahay ay mismo ay tipikal na hindi katatag sa halip na tradisyonal na bahay. Halimbawa, maaaring hindi ito siguradong ligtas sa ilang ekstremong panahon tulad ng tornado o hurkan na maaaring malaking bagay depende kung saan ka nakatira. Narito ang ilang mahalagang payo upang makita sa gastos ng isang bahay na gawa sa konteypo kung gusto mong magbigay nito sa iyong sarili. Una, maaaring gamitin ang muli o nailikha na mga bahagi tulad ng dating kahoy o metal na maaaring makatulong sa pagsasama ng iyong bayad. Hindi pagmamahal ng pera hindi lamang iiligtas sa iyo ang pera, subalit kung gagamitin mo ang tela at trapo ito ay wasto din. Iba pang alternatibo na maaari mong manumpa ang isang kontraktor na espesyalista sa paggawa ng bahay na gawa sa konteypo. Ang CDPH pintahang Konteyner House dapat may malalim na pag-unawa tungkol dito at maaaring tulakain ka sa pagkuha ng pinakamahusay na mga transakyon sa mga materyales pati na rin ang trabaho. Ang maingat na pagsasaalang-alang ng itinerary ay isa pang mahalagang punto na dapat tandaan. Umupo at talakayin talaga kung ano ang nais mong makita sa iyong bahay. CDPH foldable Container House maaaring magkaroon ng mas mataas na presyo kung dagdag mo ang mga tampok at kagamitan. Kaya naman, kailangan mong malaman kung ano ang tunay na kinakailangan mo at saan ito maaaring gawin. Sa proseso, makakapagbuo ka ng isang budget at sundin ito habang sinusukat mo ang iyong bahay gamit ang container. Sa iba't ibang dahilan, ang mga bahay na gamit ang container ay maaaring mas ekonomiko kumpara sa tradisyonal na pamumuhay. Una, madalas silang mas murang magkakaina. Ang CDPH prefabricated house container ay berde din sa ilalim ng mga termino na nagrerecycle ng dating mga shipping container kaya nakakabawas ng basura at polusiyon. Gayunpaman, tulad ng mga modular na bahay tulad ng mga shipping container, maaari mong baguhin ito nang buo at maaari mong sukbihin ang iyong bahay nang paraan mong gusto Sa mas malawak na kaligiran, mula noong lumago ang movement ng container home, lumago rin ang lahat ng mga resource na magagamit ng mga taong gustong magkaroon ng isang container home. Ang prefabricated container house may maraming online groups at forums kung saan maaari kang sumali at makipag-uwi sa mga kasamang builder ng container home. Ang building communities ay mga lugar kung saan maaari mong makuha ang tulong, payo o simpleng makipag-usap sa mga taong bago at nasa gitna ng kanilang proseso ng paggawa. Ang prefab na bahay ay gumagamit ng espesyal na disenyo para sa kahusayan ng istruktura at kakayahang magbigay ng mabuting pagganap laban sa lindol upang matiyak ang kaligtasan. Ang modular na disenyo ay madaling ilipat, at ang pag-install ay maaaring i-adapt batay sa iyong personal na panlasa sa iba't ibang disenyo, istilo, at uri ng kuwarto. Lahat ng mga bahagi ay prefabricated at madaling ilagay sa tamang posisyon nang walang pangangailangan ng anumang espesyal na kasanayan. Kung ito man ay para sa opisina, tirahan, imbakan, o anumang iba pang sitwasyon, ang prefab na bahay ay kayang tugunan ang iyong mga pangangailangan. Nakakagulat na anyo, malalapat na guhit, at ang kakayahang i-customize batay sa iyong personal na panlasa upang lumikha ng perpektong espasyo para sa pamumuhay. Pinakamahusay pa rito, ang mga prefab na bahay ay hindi nangangailangan ng welding sa lugar, at binibigyan ka namin ng mga instruksyon sa pag-install upang gawing mas madali at mas mabilis ang proseso ng pag-install. Tangkilikin ang pinakamahusay na buhay na maaari mong maranasan—pumili ng mga container home o mga prefab na bahay. Gawin ang iyong tahanan na mas ligtas at komportable sa pamamagitan ng pag-install ng isang container house! Ang lahat ng istruktural na bahagi ay prefabricated sa isang pabrika. Sa pamamagitan ng pagpili ng tamang sukat, konpigurasyon at istilo, maaari mong likhain ang iyong espasyo para sa pananahan nang mabilis. Ayon sa kanilang mga pangangailangan at kagustuhan, maaaring isama ang ilang mga module sa iba't ibang layout ng kuwarto upang makabuo ng multi-functional na container home na maaaring gamitin bilang living room, kusina o silid-tulugan. Ang pinakamahalagang dapat tandaan ay ang container house na ginagamit namin ay madaling i-disassemble at i-assemble, may matibay na istruktura, at may mahusay na pagganap—tulad ng waterproof, anti-panlilipat ng tubig, panghihigpit sa apoy—at ang proseso ng pag-install ay madali at simple na pamahalaan, na walang kailangang espesyal na teknikal na ekspertise. Para sa personal na pananahan, imbakan, pansamantalang opisina, o iba pang layunin, ang mga prefab container house ay idinisenyo upang tugma sa iyong mga kinakailangan. Samantalahin ang isang box room ngayon, tamasahin ang mas magandang presyo at mas mahusay na serbisyo—pagbutihin ang iyong pamumuhay! Kabina ng Apple, natatanging hugis, magandang anyo, nagpapaganda sa iyong tahanan at nagbibigay-daan para maging mas personal ito. Nag-ooffer kami ng malawak na hanay ng mga kulay at istilo upang tugunan ang iyong mga kagustuhan—mula sa simpleng moderno hanggang sa tradisyonal. Ang Beijing Chengdong ay nakatuon sa mga kagustuhan at pangangailangan ng mga gumagamit. Maaari itong i-customize upang tumugon sa iyong mga kinakailangan. Ayon sa iyong sariling nais at kagustuhan, maaari mong baguhin ang hugis ng layout ng bahay, ang pagkakasunod-sunod ng mga kuwarto, pati na rin ang layout ng tubig at kuryente. Sa ganitong paraan, nabubuo ang perpektong tahanan na natatangi lamang sa iyo. Ang pre-fabrication ng mga tubo para sa tubig at kuryente ay tumutulong sa amin na maiwasan ang mahabang proseso ng pag-uulit ng pagkakalagay ng mga tubo matapos ma-decorate ang bahay, na nagpapataas ng kahusayan at kalidad ng dekorasyon. Nag-ooffer kami ng iba’t ibang opsyon sa layout para sa loob ng bahay, kabilang ang living room at dining room, mga silid-tulugan, kusina, banyo, atbp. Maaari mong piliin ang opsyon na pinakasumakop sa iyong mga pangangailangan at kagustuhan upang lumikha ng isang ideal at natatanging tahanan para sa iyo. Apple House – Kalidad ng pamumuhay sa kanyang pinakamataas! Alamin ang presyo ng mga container home ng Apple House! Ang folding house ay batay sa Container homes cost ng isang tradisyonal na bahay, na maaaring idisenyo ayon sa iyong mga pangangailangan, maabot ang masalimuot na produksyon, at gawin ang iyong kapaligiran sa pagtira na mas sigurado, mabilis at ligtas. Ang silid ay maaaring gamitin nang makakasama ang iba't ibang pangangailangan, ibig sabihin maaari mong makuha ang kagandahan sa anumang lugar at oras. Mabilis na pagpapadala! Ang pagsasaalang-alang at pagpapadala ay mabilis din, dahil gumagamit kami ng mga propesyonal sa aming tauhan ng pagsasaalang-alang, ayon sa iyong mga pangangailangan upang i-pack ang folding room at siguraduhin na makukuha mo ang pinakamainam na kalidad ng produkto. Babantayan namin bawat hakbang ng proseso ng pagpapadala upang siguraduhin na umabot ang iyong mga produkto sa kanilang destinasyon nang ligtas at sigurado. Ang foldable house ay maaaring itayo nang walang pagweld sa lugar at nagbibigay kami ng mga instruksyon sa pag-install upang magpadali at magbigay komport sa proseso. Kung sundin mo ang mga hakbang sa mga instruksyon, makakakuha ka ng madaling pag-install ng bahay na maaaring maitimulad. 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.Kostong-bahay ng konteyner
Gaano Karaming Gagastusin Talaga Para Magbigay ng Bahay sa Konteyner?

Alin ang Mas Kost效益nte?

Mga Tip para sa Paggawa ng Bahay na Kost效益nte gamit ang Konteyner

Bakit ang mga Bahay na Konteyner ay isang Kost效益nte Alternatiba
Why choose CDPH
Kostong-bahay ng konteyner?
Bagong dating prefab house
Mabuting Benta ng container house
Modern Style apple cabin
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