қараңыз ...">
,需要通过父级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 түнде жұлдыздар сияқты ұйықтауға мүмкіндік беретіндей етіп, мықты және дайын болып жасалған. Жеңіл және ауырғыш, лагерьдік жатақ орын - бұл опттап сатылатын лагерьдік заттардың негізгі таңдауы - #1 лагерьдік жүк көтергіш интернет-дүкенінен қазір ең төменгі бағамен алыңыз! Онда осы келесі табиғат серуеніңізге міндетті түрде ала келуіңіз керек пе, соның барлық себептеріне тоқталайық! Лагерьдік жүк көтергіш жатақ орын - Қатты Табиғат 4,5-тен 5 жұлдыз 13 $40,4016' Xtra-Comfort Сығылғыш Көтерілетін Лагерьдік Тесіктері бар - Компактты Тасымалдау Салы, Ауа Сорғыш Көк, Компактты … Ерекшелік: Артқа қарай бүгілетін XXGEF Пайдаланушы: Ересек, Бүгілген: Жоқ Стиль: балық аулау, Теңіз жағалауы, Шара: жеке Материал: Жоғары сапалы су өткізбейтін деңгей: Еден L30000 мм Жинаққа кіреді: 1 дана кемпингтік шара Ескерту: Жарықтың әсерінен және экрандардың айырмашылығынан суреттегі тауардың түсі нақты тауардың түсінен сәл өзгешелеу болуы мүмкін. Тауда немесе теңіз жағалауында болсаңыз да, бұл мықты жебе сізге ыңғайлы да сенімді ұйқыны қамтамасыз етеді. Тұрақты құрылым ұзақ уақыт пайдалануға кепілдік береді және сіздің салмағыңызды оңай көтереді, бірақ сынбайды, ұзақ уақыт пайдалануға болады және сіздің салмағыңызды жеңіл көтереді. Сонымен қатар, бұл жебенің портативті құрылымы оны әлдеқайда әкелуге мүмкіндік береді, сондықтан жаңа саяхатқа шығу үшін лагерь ұйымдастыруға болады. XIEHE MEDICAL бірлік палатка-тасымалдауыштың негізгі артықшылықтарының бірі - оның жеңіл және тасымалдауға ыңғайлы болуы. Бұл тасымалдауыш үлкен және ауыр палаткалық жатын орындар сияқты емес, оны бүктеп шағын салқын сөмкеге салуға болады. Бұл өз жабдықтарының салмағы мен өлшемін азайтуға мәжбүр болатын арқаныңыздың иесі немесе палаткашы үшін өте ыңғайлы. Орманда палатка қурсаңыз немесе тек досыңыздың үйіне түнде қалу үшін барсаңыз да, осы жатын орынды қолыңызға алсаңыз, әдемі ұйқыңызға асықпаңыз. Табиғаттың ашық кеңістігінде бүкіл күні серуендеуден кейін тыныш ұйқы - бұл міндетті шарт, ал табиғаттың ең жақсы тыныштық орнымен сізді қамтамасыз етеміз. XIEHE MEDICAL лагерьдік жеке тасымалдаушикісі сіздің ыңғайлы ұйқыңызға қол жеткізу үшін жасалды, ал толық еніндегі үлкен жатақтың беті тыныш ұйқыны қамтамасыз ететін демалыс мата бетінен жасалған. Бұл тасымалдаушикінің ыңғайлы эргономикалық құрылымы сізді жақсы ұстап, келесі күнгі жаңа серуенге дайындалу үшін демалып, күш жинай аласыз! Қиын, ыңғайсыз ұйқы паддарына қош бол, ал ыңғайлы лагерьдік тасымалдаушикімен тамаша түнгі ұйқыға қош келдіңіз (ия, нақты сіз үшін осы ыңғайлы лагерьдік тасымалдаушикімен ұйқы туралы айтамыз). Жалпы алғанда, ашық аспан астында пайдаланылатын жабдықтар үшін ең маңызды фактор – беріктік пен сапа. XIEHE MEDICAL компаниясының бір орындық лақтыруы сапалы материалдардан жасалған, сондықтан оның ұзақ уақыт пайдалануға болатындығына кепілдік береді. Ыстық, ылғал ауада не суық түнде кемпингке шықсаңыз да, бұл лақтыру климат жағдайларына төтеп бере алады. Осы жоғары сапалы кемпинг лақтыруы сізді келешекте жылдар бойы тамаша сыртқы тәжірибелерге икемді сезінуге мүмкіндік береді, егер оны жақсы қамқорлықпен ұстасаңыз. XIEHE MEDICAL Camp Stretcher Single-мен өзіңізге берік, ыңғайлы және тыныш ұйқы алыңыз! Егершік жабдықтардың арзан бағамен сатып алуын қалайтын үлкен көлемді сатып алушы болсаңыз, онда XIEHE MEDICAL лақтыру тақтасы single - бұл сіздің идеалды таңдауыңыз. Бұл қате баға емес... сенімді өнім үшін өте жақсы құндылық – берік конструкцияға ие, бірақ әлі де тасымалдауға ыңғайлы, шыныменде «сазбалшық»! Сіз дүкеніңізді немесе жалға беру қызметіңізді жабдықтауда болсыңыз немесе болмаса, бұл лақтыру тақтасы сіздің клиенттеріңіздің бюджетін қиындатпай-ақ оларды мемлекеттік деңгейде қанағаттандырады. Асықпайтын және сенімді кемпинг жинағымен клиенттерді әсерлендіруге арналған, олардың сыртқы әлемдегі демалысын толыққанды түрде толықтырады. Сиехэ медициналық құрал-жабдықтарының кемпинг үшін арналған жалғыз төсек-төсеніші глобалды нарықта сатылады. Өткен 10 жыл ішінде серіктестердің қолдауы мен жұмыстары нәтижесінде әлем бойынша 30-дан астам дистрибьюторларға ие болдық. Өнімдеріміз 120-нан астам елде қолжетімді. Біз интеграторлармен және дистрибьюторлармен ұзақ мерзімді серіктестік орнатуға, олармен бірге болашақты құруға және дамытуға бағытталғанбыз. Hehe Medical Equipment компаниясы клиенттердің қанағаттануын басшылыққа алады, клиенттердің сапалы және сенімді кемпингтік төсек-орындарын қамтамасыз етуге ұмтылады. Біздің ынтамен жұмыс істейтін қызметкерлеріміз бен ынтымақтастық негізіндегі технологиялар бізге клиенттерге жақын, назар аударатын қызмет көрсетуге мүмкіндік береді, олардың талаптары тиімді түрде қанағаттандырылады. Біз өз клиенттерімізбен ұзақ мерзімді және тұрақты ынтымақтастық орнатуға ұмтыламыз және ынтымақтастық пен техникалық қолдау арқылы оларға жоғары сапалы өнімдер мен қызметтер ұсынамыз. Xiehe Medical Apparatus Instruments компаниясы үнемі шығармашылық ғылыми-зерттеу жұмыстарына қатысады және бағытталған сатылатын өнімдерді ұсынуға ұмтылады. Патенттелген және интеллектуалдық меншік құқығы қорғалған өнімдерімізге кемпингтік төсек-орындары, алғашқы көмек заттары, ауруханалар үшін мебель, сонымен қатар жерлеу өнімдері кіреді. Бұл өнімдер қазіргі заманғы тенденцияларға сай әзірленген және клиенттеріміздің талаптарын қанағаттандырады. Олар қазақстандық және шетелдік клиенттер арасында да танымал. Профессионал медициналдық құралдар өндірушісі ретінде, Xiehe Медициналдық Апаратурасы және Інструменттері қызметпер өнімдер және специалдық қызметтер ұсынады. ISO13485 сапалық басқару системасын строго орындау, барлық өнімдеріміз TUV, CE, FDA және басқалары таңдауларымен сертификатталған. Кемпинг қабырғасы бірлікте отырғызу командасы бар, ол клиенттердің талаптарына жылдам қарай алады және жоғары сапалы және стабильдікпен өнімдерді ұсынады. Егер сіз спасения қабырғасы немесе госпитальдерге арналған құйылған қабырға жабдықтарына жағдайында, Xiehe Медициналдық Құралдар жауап береді.кемпингтік арқалық
Тасымалдауға ыңғайлы жеңіл және компактты дизайн

Демалыс кезінде тыныш ұйқы алу үшін ыңғайлы бір адамдық кемпингтік жатқызғыш

Ашық аспан астында пайдалануға сенімді сапа мен ұзақ қызмет ететін материал

Қолжетімді бағаға кемпинг жабдықтарын үлкен көлемде сатып алушылар үшін тамаша шешім
Why choose XIEHE MEDICAL
кемпингтік арқалық?
Дүниежүлі маркетингтік тармақтары мен стабилтіктік қошырақтар
Қызметкерлерге бағытталған жылдам шектейтін қызметтер және техникалық қолдау
Қызметкерлердің қызықты іс-әрекеті және сатып алудың негізгі нүктелері
Жоғары сапалы өнімдер және мәселелік қызметтер
Байланысты өнім санаттары
Іздеуіңіз бен бәрі табылмады ма?
Қазір сұраныс жасаңыз
Қолжетімді өнімдер туралы кеңесшілерімізбен байланысБАЙЛАНЫСУ