...">
,需要通过父级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);
}
});
})();
Եթե դուք ճամփորդությունների սիրահար եք կամ հաճախ եք մասնակցում արտաքին գործողությունների, արդյոք ցանկանում եք ձեր սիրեցյալի կողքին լավ գիշեր անցկացնել: Նայե՛ք այս Ստորագրման սեղան ճամփորդական կոշիկ մեկ հատ։ RokForm Rugged Portable Stand-ը պատրաստված է ամուր և պատրաստ է ձեզ հնարավորություն տալու, որ գիշերը քնեք աստղերի նման՝ անկախ նրանից, թե որտեղ եք գտնվում։ Լույս և կրկելի, ճամփորդական անկողինը մեծ ընտրություն է մա wholesales ճամփորդական ապրանքների համար՝ ձեռք բերեք այն հիմա ամենացածր գներով #1 ճամփորդական կոշիկի առցանց խանութից։ Այսպիսով, եկեք դիտարկենք բոլոր պատճառները, թե ինչու՞ է սա ինչ-որ բան, որ պարտադիր է վերցնել ձեր հաջորդ վայրենի արկածի ընթացքում։ Ճամփորդական կոշիկի անկողին - Դժվար վայրերում օգտագործվող 4.5 աստղ 5-ից 13 $40.4016' Xtra-Comfort Փուչ բարձրացված ճամփորդական օդափոխվող - Կոմպակտ կրկային պայուսակ, օդափոխիչ կապույտ, կոմպակտ ... Հատկանիշ. Լռելու դիրք XXGEF, Վերաբերում է. Մեծերին, Տեղավորված՝ ոչ, Ոճ. ձկնորսություն, Ծովափ, Անկողնու չափը՝ միայնակ անկողին, Նյութ. Բարձր ամրությամբ ստրեչեր, Ջրակայունության մակարդակ. L30000 մմ հատակ, Փաթեթի պարունակությունը. 1x հարմարանք ճամփորդության համար: Նշում. լուսանկարման լույսը և տարբեր էկրանները կարող են նկարում առարկայի գույնը փոքր-ինչ տարբեր ցուցադրել իրականից: Արդյոք դուք հաստատվում եք լեռներում, թե ափին, այս ամուր կրողակազմը ձեզ կտա հաստատուն և ապահով քուն: Դիմացկուն կառուցվածքը երաշխավորում է երկարակեցություն և հեշտությամբ կարող է ձեր քաշը կրել, նույնիսկ լարված վիճակում, և չի կոտրվի: Բացի այդ, այս կրողակազմի կարգավոր կառուցվածքը թույլ է տալիս այն տանել ցանկացած տեղ, որտեղ ցանկանում եք ճամփորդել և սկսել նոր արկած: Սակայն XIEHE MEDICAL ճամփորդական կրավաթի հիմնական առավելություններից մեկը նրա թեթև և կոմպակտ լինելն է: Այս կրավաթը չի զբաղեցնում շատ տեղ, այն կարող է ծալվել և տեղավորվել փոքր տանող գործիքի մեջ: Սա հիանալի տարբերակ է այն ճանապարհորդների համար, ովքեր ստիպված են իրենց սարքավորումների քաշն ու չափսերը նվազագույնի հասցնել: Անկախ նրանից՝ արդյոք դուք ճամփորդության եք գնում անտառներում, թե պարզապես գնում եք ձեր ընկերոջ մոտ մի քանի օր մնալու, պարզապես վերցրեք այս կրավաթը, և գեղեցիկ քունը միշտ ձեր մոտ կլինի: Հանգստանալու մի քայլ է հետևում արտաքին տարածքներում լի արկածներ օրվանից հետո, և մենք ձեզ ապահովում ենք բնության լավագույն հանգստի մահճակալով: Մեր XIEHE MEDICAL ճամփորդական կրողը մեկ անձի համար ստեղծված է ձեր հարմարավետության մասին մտածելով. մեծ լայնությամբ մահճակալը պատրաստված է շնչող գործվածքից, որը քնելու ընթացքում ավելի հարմարավետ է դարձնում ձեր կեցությունը: Այս կրողի մտածված էրգոնոմիկան լավ աջակցում է ձեզ, որպեսզի հանգստանաք և վերալիցքավորվեք՝ պատրաստվելով հաջորդ օրվա արկածներին: Ցտեսություն այն անհարմար և անհարմարավետ անկողնի պայթեցմանը, ողջույն լավ քնին (այո՛, ձեզ համար այս հարմարավետ ճամփորդական կրողով կա հանգստի կրող): Ընդհանուր առմամբ, վայրէջքի պարագեղերի դեպքում ամենակարևոր գործոնը տևականությունն ու որակն է: XIEHE MEDICAL-ի մեկ տեղանոց ճամփորդական կրողակազմը պատրաստված է որակյալ նյութերից՝ երկարակեցությունն ապահովելու համար: Անկախ նրանից՝ տաք, խոնավ եղանակում եք ճամփորդության գնացե՞լ, թե ցուրտ գիշերում, այս կրողակազմը կհաղթահարի տարրերի ազդեցությունը: Այս գերազանց ճամփորդական կրողակազմը ձեզ հարմարավետություն կապահովի տարիներ շարունակ բացօթյա հիանալի ապրումների համար՝ ճիշտ խնամքի և սպասարկման դեպքում: Խնամքով և հարմար խնամքով ձեռք բերեք ամուր, հարմարավետ քուն՝ XIEHE MEDICAL-ի մեկ տեղանոց ճամփորդական կրողակազմի շնորհիվ: Եթե ձեր մոտ մեծածախ գնումների համար փնտրում եք էժան լաստակներ, ապա XIEHE MEDICAL-ի միապատիկ ճամփորդային կրող ձեզ համար իդեալական ընտրությունն է: Գինը վատ չէ... սա հիանալի առժեք է մի ամուր արտադրանքի համար՝ ամուր կառուցվածքով, սակայն դեռևս կրկելի՝ այն անկողին, որը տարուբերում է: Արդյո՞ք դուք սարքավորում եք ձեր մանրածախ խանութը, թե վարձակալության ծառայությունը, այս ճամփորդային կրողը կբավարարի ձեր հաճախորդներին՝ առանց բանկայի կոտրելու: Կառուցված է՝ հիացնելու հաճախորդներին մի շատ էժան և ամուր ճամփորդային հավաքածուով, որը կլրացնի նրանց բացօթյա ապրումները: Xiehe Medical Apparatus Instruments ընկերության ճամբարավարության համար նախատեսված մեկ տեղանոց մահճակային սայլակը մեկնարկել է գլոբալ շուկայավարման և վաճառքի համար։ Անցյալ 10 տարվա ընթացքում գործունեության և գործընկերների աջակցության շնորհիվ այժմ ունենք 30-ից ավելի բաշխիչ ամբողջ աշխարհում, իսկ մեր ապրանքները հասանելի են 120-ից ավելի երկրներում։ Մենք կենտրոնացված ենք երկարաժամկետ գործընկերությունների ստեղծման վրա ինտեգրատորների և բաշխիչների հետ՝ միասին կառուցելու և միասին կառուցելու ապագան։ Hehe Բժշկական սարքավորումները նախապայմանադրված է հաճախորդների բավարարվածության վրա և ձգտում է ապահովել հաճախորդների համար առաջնային որակի և հուսալիության ճամբարային մեկուսացված մահճակները: Մեր նվիրված աշխատակիցները և համատեղ տեխնոլոգիաները մեզ հնարավորություն են տալիս մեր հաճախորդներին մոտիկ և ուշադիր սպասարկում ցուցաբերել՝ համոզվելով, որ նրանց պահանջները արդյունավետ կբավարարվեն: Մենք ձգտում ենք հաստատել երկարաժամկետ և կայուն համագործակցություն մեր հաճախորդների հետ և թիմային աշխատանքի ու տեխնիկական աջակցության միջոցով նրանց մատակարարել բարձրորակ ապրանքներ և ծառայություններ: Xiehe Բժշկական սարքավորումները և սարքերը շարունակաբար ներգրավված են ստեղծագործական հետազոտական և մշակման աշխատանքներում և նվիրված են մրցունակ վաճառքի հատկանիշներ ունեցող ապրանքների մատակարարմանը: Ապրանքների վրա գրանցված են պատենտներ և մտավոր սեփականության իրավունքներ՝ ներառյալ ճամբարային մեկուսացված մահճակները, առաջին օգնության միջոցները, հիվանդանոցների առարկաները և թաղման ապրանքները: Այս ապրանքները մշակված են ըստ ժամանակակից միտումների՝ հաճախորդների պահանջները բավարարելու համար: Դրանք գնահատվում են ինչպես տեղական, այնպես էլ օտարերկրյա հաճախորդների կողմից: Որպես պրոֆեսիոնալ բժշկական սարքավորումների արտադրող, Xiehe Medical Apparatus Instruments- ը ապահովում է բարձրորակ արտադրանք եւ մասնագիտացված ծառայություններ: խստորեն իրականացնել ISO13485 որակի վերահսկման համակարգ, եւ մեր բոլոր արտադրանքները հավաստագրված են TUV, CE, FDA, Երբ ձեզ անհրաժեշտ է շտապօգնության բարձիկ կամ փակվող բարձիկների կահույք հիվանդանոցների դիահերձանքների համար, Xiehe Medical Equipment- ը ունի պատասխանը:կենտրոնացող ստրունք միատարաź
Թեթև և կոմպակտ կոնստրուկցիա՝ հեշտ տեղափոխման համար

Հարմարավետ մեկուսի լագատ՝ հանգիստ քնի համար

Գործնական որակ և մաշվողականության դիմացկուն նյութ բացօթյա օգտագործման համար

Իդեալական լուծում ապահով ձեռք բերումներ փնտրող մեծածախ գնորդների համար
Why choose XIEHE MEDICAL
կենտրոնացող ստրունք միատարաź?
Գլոբալ մարքետինգ ցանց և կայուն գործընկերներ
Հաճախորդներին կենտրոնացված արագ հետապահանջային սպասարկում և տեխնիկական աջակցություն
Նորագույն հետազոտություն և արտադրանքների վաճառում
Բարձր որոշակիությամբ ապրանքներ և մասնավոր ծառայություններ
Հարակից արտադրանքի կատեգորիաներ
Չե՞ք գտնում ձեզ հարմարեցնողը:
Դիմեք մեզ գին առաջարկի համար հիմա
Մեզ զանգահարեք խորհրդատուների հետ՝ մեր առկա պահեստի մասին տեղեկատվություն ստանալու համար:Կապվեք մեզ հետ