...">
,需要通过父级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);
}
});
})();
XIEHE MEDICAL Ascensorium sedile automaticum pro gradibus: Innovatio vera pro iis, qui motu impediti sunt. Gaudemus offerre XIEHE MEDICAL Automatic lectus Examinatorius pro scalis, productum revolventis quod vitam eorum mutat qui cum motu sursum vel deorsum scalas luctantur. Haec technologia novissima parata est ut hominibus summam facilitatem, securitatem et libertatem praebet ut ab uno ad aliud aedificii pavimentum progrediantur. Usus XIEHE MEDICAL Automatic cubiculum Gynecologicum pro scalis, nostri clientes facile accedunt ad varios structurae pisos sine alterorum auxilio. Nostrum sedes automatica pro scalis facilis ad usum est et multas peculiares proprietates habet, quae eam optionem lucrativam et tutam praebent iis, qui motu difficiles sunt. Sedes commodus, scabello robusto, et baltei tutores sunt omnia necessaria partes sedis elevatricis, quae tutitatem usoris et transitum continuum ab uno extremo scalarum ad alterum servant. Controlla sedis elevatricis vel evocandi vel manuales sunt et maxime facilia ad usum, ut nostri consumptores inter pisos transferri possint pressione unius buttonis. Praeterea, sedes elevatrix ita est descripta, ut quam minimum loci in scala occupet, pulchram et practicam speciem habens. Sedes elevatrix sensoribus constat, qui detegunt, cum aliquid progressionem impediat, eamque sistit, ut damnum vel vulnerationem effugiat. Praeterea, nostra sedes automatica ad gradus adaptari potest ad varios graduum stilos, sive rectos sive curvos. Nostra professio cum singulis clientibus arcte cooperatur ut eorum necessitates singulares cognoscantur et solutio ad mensuram fabricetur quae domui vel aedificio conveniat. Cum nostro studio qualitatis et tuiti, XIEHE MEDICAL pollicetur omnem sedem automaticam ad gradus summae qualitatis esse et diligenter examinatam ut securitas et fiabilitas certificetur. Sedes automatica ad gradus a XIEHE MEDICAL est vera mutationis causa pro iis qui motilitate imminuta utuntur, quia efficienciam et protectionem sine pari praebet dum in aedificio plurium ordinum movetur. Tecnologia nostra promotissima et studio excellentiae nos faciunt confidenter offerre productum quod independentiam auget et qualitatem vitae meliorem reddit iis qui infirmitates motilitatis habent. Ad plura sciscita de quo modo nostra sedes automatica ad gradus locum tuum mutare possit et aditum omnibus meliorem reddere, nunc nobiscum contubernio inito. Levatores cathedrarum nostri ex materialibus praemiatis et technologia novissima aetate constructi sunt, ut usum lenem et silentem garantiant. Facile installantur et ad omnem scalae formam plane adaptari possunt. Levatores cathedrarum usque ad 350 libras levandorum capacitate muniti amplitudinem usorum amplecti possunt. Optionibus grossulariis propositis, productos nostros latiori publico admittere volumus, ut quam plurimi homines commode et libere uti possint levatoribus cathedrarum nostris. Ubi optima pretia pro levatoribus automaticis cathedrarum pro scalis inveniri possunt? Optima pretia pro levatoribus automaticis cathedrarum pro scalis pete apud XIEHE MEDICAL. Levatores cathedrarum praemiati ad pretia modesta offerimus et servitium praeclarum clientibus praebemus, qui levatores cathedrarum alti qua litatis ad pretium rationabile desiderant. Emere levatores cathedrarum nostras potes per situm nostrum, catalogum nostrum spectare et comparare, et ordinationem ad tuam opportunitatem facere. Levatores cathedrarum nostri etiam in tabernis specialibus et institutis medicis haberi possunt. Mercai nostri licentiati gaudent te iuvare, ut levatorem cathedrarum idoneum ad tua necessaria detegas, et installatione iuvare te possunt. Sive per interretum sive coram malis, XIEHE confidere potes, ut tibi pretium praeclarum de levatoribus automaticis cathedrarum pro scalis praestet. An levatores automatici cathedrarum pro scalis pecuniam profecto valeant? Tandem vero in lectica automatica pro scalis a XIEHE MEDICAL fabricata investire praeclara res est. Nobiscum, qualitatem vitae tollere, facile fit. Nostrae lecticae tutum et commodum modum praebent ut homines qui mobilitate laborant ab uno ad alterum locum domi vel in variis aedificiis progrediantur. Utrum tu eam habeas institutam ut meliorem mobilitatem et independentiam personaliter fruaris, aut ut cari tibi fruantur emptione, unum quod sequitur est usus iucundior et commodior in actionibus cotidianis. Praeterquam quod statim qualitatem vitae meliorem efficit, nostra lectica tua possessionis pretium augent. Itaque si domum tuam vendere cogeris, iam habere lecticam futuros emptores magis adliciet, praesertim eos qui mobilitate quoque laborant. Sine dubio XIEHE MEDICAL elige et in tuam futuram securitatem et commoditatem cum nostris durabilibus et fidelibus lecticis investe. Pro his, qui motu ob infirmitatem laborant, fabricantis praestantiola: rampae et scalae ad accessum ex aluminio, ferro aut aere. Utrum incrementum/decrementum in longissimis scalis fiat, cathedra elevans ad scalam automaticam verus usus esse potest. Prorsus exacta est. Fornicent viam tutam et commodam ad gradus ascendendum vel descendendum, cum adminiculum non sit praesens. Cathedrae levationis XIEHE MEDICAL ita fiunt, ut facile tractari possint et fidae sint, ut tu cum fiducia ad diversa aedificii tui aequora accedas. Pro iis, quorum vis aetate, vulnere vel infirmitate imminuta est, qua cumque vitae parte, cathedrae scalandi graduatim ascendentis – inter quas cathedrae automaticae includuntur – solutiones domesticae practicae sunt. Apud XIEHE MEDICAL, gaudeamus offerre optiones elevatorum sedentium automaticorum ad venditionem in grossis pro scalis, adiuvantes commercia et institutiones ut his instrumentis salutis servandae populo maxime egeanti provehant. Emptio in massa permittit commerciis magnas pecunias conservare, et clientibus ut habeant elevatorum sedentium de pretio alto et fido. Electio productorum in grossis a XIEHE MEDICAL parata est ad loca varia complenda, inter quae sunt hospitales, domus auxilio plenas ministrantia, et privatae residentiae. Gratiis pretiis competitivis et praeclaro ministerio erga clientes, XIEHE MEDICAL optima electio est pro commerciis quae interesse habent elevatoribus sedentibus automaticis pro scalis praebendis. Cum quolibet genere sediliae automaticae elevandae ad usum scalorum, sunt quaedam negotia quae experiri potes uti usor. Unum problema est quod ascensor sedilis fortasse non bene adaptae sint ad formas quasdam scalarum, velut scalas curvilineares aut angustas. Hoc homines impediendos esse posset ut ascensorem sedilis tutis utantur. Aliud est quod etiam imminuti in tempore possit accidere. Sicut omnis machina, sediliae automatica (ad scalas) subiecta esse possunt attritioni, quod significat eos, sicut plerique machinas, opus habere frequenti ministerio et emendationibus. Praeterea, pro aliquibus hominibus initio perinde carum esse potest emere et constituere ascensorem scalaris. Quamquam ascensoria sedilia automatica gradibus non sine defectibus sunt, generaliter tamen habentur pro bono investimento. Ascensorium sedile permittit motum independentem in omnes partes domus euntibus et revertentibus iis, qui motu restricti sunt. Re vera vitam qualitatem meliorem praebet eis et auxilium est, ut diutius in sua domo manere possint. Praeterea, de commoditate et tutela, quam ascensorium sedile praebet, non potes nimis cogitare. Et usores gradus, scalas vel scalaevias ascendere et descendere possunt sine cadendo aut laedendo se. Omnino, ascensoria sedilia automatica pro gradibus securitatis sensum et flexibilitatem domesticam additam praebent, quae pro multis investimento digna sunt. Ut fabricator peritus instrumentorum medicae, Xiehe Medical Apparatus Instruments praebet producta altae qualitatis simul cum servitiis specialibus. Omnia producta certificata sunt ab institutis TUV, CE et FDA; observant systema qualitatis ISO 13485. Adest aequipe dedicata quae celeriter ad necessitates clientium respondet atque praebet automaticam sellam elevatricem graduum altae qualitatis et stabilitatis. Sive lectum ambulantis, sive lectum plicabilem, sive mobilia hospitalaria, sive apparatus funebres requiras, Xiehe Medical Equipment solutionem habet. Xiehe Instrumenta Medica Apparatusque firmam fortiter ad novorum productorum studium atque inquisitionem (R&D) et ad praebenda producta cum competitivis venditionis argumentis dedere. Patentia et proprietates intellectuales: automaticus sellae ascensor pro gradibus pro lecticis medicis, pro primae auxilii instrumentis, pro mobili hospitalari et pro funerariis usibus. Nostri apparatus ad desiderata clientium conficiuntur et cum praesentibus temporum rationibus congruunt. Haec producta a clientibus domesticis externisque bene accipiuntur. Hehe Instrumenta Medica clientium satisfactionem anteponit et conatur necessitatibus eorum respondere per qualitatem et fidem. Per studium et technologiam collaborativam, una cum ardore nostri personae, possumus clientibus servitium personale et fidele praebere. Nostrum finis est ut automaticus sellae ascensor pro gradibus perpetuum, stabilem et cooperativum cum clientibus nostris consortium constituat, simulque eis optimae qualitatis producta et servitia suppeditet. Xiehe Medical Apparatus Instruments dedicavit se globali marketing venditionis strategia. Plus quam 30 distributores operantur in plus quam 120 nationibus post plus quam 10 annos supportis a nostris partnerebus. Studeamus stabilire longa relationes cum distributores et integratores ut ordinent ad automaticam sellam elevatricem pro gradibus in futuro simul.Levator automaticus sellae pro scalis
Discoperi Beneficia Elevatorum Automatice Sedentium pro Stairis

Optiones Emptionis Maioris Elevatorum Automatice Sedentium pro Stairis

Communes Difficultates cum Elevatoribus Automatice Sedentium pro Stairis

Suntne Elevatores Automatice Sedentium pro Stairis Meri Investimenti?
Why choose XIEHE MEDICAL
Levator automaticus sellae pro scalis?
Alta qualitas producta et specializata servitia
Inventiva R et D Et Venditionis Puncta
Velocitas Post-Venditionis Servitium et Technicum Sustentaculum Centratum in Clientibus
Universale marketing rete et stabiles partneri
Categoriae productorum affines
Non invenis quod quaeris?
Nunc Quotationem Petas
Consulentes nostros contacta pro productis amplioribus.Contactum fac