quae nos protegunt contra res quae explodere possunt. Technologia i...">
,需要通过父级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);
}
});
})();
Machinae ad explosionem delectam sunt tuba visionis nocturnae quae nobis adiuvant contra ea quae explodere possunt. Technologia est fabrica quorundam optimorum instrumentorum ad explosionem delectandam. A societas utitur camera imaginum thermicarum pro Android certificando quod detectores explosivarum eius summe efficientes sint. Haec machina plura genera explosivarum, a liquidis ad pulveres, incredibiliter cito et accurate reperire possunt. Posse tubi nocturnae visionis ad hastas necessarium ad securitatem locorum qualia sunt aëroportus, stationes ferroviariae, et alii publici loci. Illi scrutantur in sacculis hominum et rebus, et auxiliantur ut mala evenienda prohibeantur. Detectors explosivorum velut heroes super qui nos tacite protegunt. Gratiassunt nocturnae visionis tubi ad hastas his machinis, copiae securitatis possunt celeriter persequi et necare omnem periculum antequam magnum evadat. Hoc fit propter deployment apparatus detectionis explosivarum quae securitatem systemata in toto orbe significative meliores fecerunt. Nos apud LSJ intellegimus quam sit cruciale praebere clientibus nostris non solum producta qualitatis sed etiam praestantem servitium. Offertimus warrantias pro uno vel plures dispositivis explosionis detectionis, quod fiduciam nostram in longae durationis et performance productorum indicat. Magna investitio nostra in investigationem et developmentum certificat te accipere producta quae conformantur altissimis standardibus. Quia somus compania manufacturae, adhaeremus severis controlibus qualitatis ab materiis primis usque ad productionem finalem. Praebemus latam varietatem productorum quae possunt satisfacere necessitatibus omnium userum. Etiam conservamus completam collectionem componentium et materiarum primitivarum ad certificandum promptam distributionem cuiusque ordinis. Si non perficiamus distributionem tempore, pollicemur refundere 2-5 percentum valoris ordinis ad clientes nostros. Ad iuvandos te uti productis nostris efficienter, praebemus videos instructionales comprehensivos. Etiam poterimus arrangere classes technicas in situ, conscriptas secundum tuas necessitates speciales, ut certificemur te esse capax uti productis nostris cum confidentia et facilitate.elige LSJ pro productis altae qualitatis et fide dignis et praestanti servitio clientium. Apud LSJ sumus periti in producendo praestantissimum instrumentum ad quaerendum et salvandum in urbibus, quod est ad normas internationales maximas descriptas compositum. Prae-mercaturae Servitium: Adestes nobiscum a principio. Praebemus consultationes integrales, ut plene cognoscamus necessitates vestras et solutiones praestemus. Praebemus etiam demonstrationes productorum cum specificis technicis, ut omnes informationes necessarias ad faciendam rationabilem decisionem habeatis. Mercatura Servitium: In processu venditionis, curamus experientiam efficacem et dispositivam explosionis detectionis. Sponsionem damus, ut producta vestra tempore opportuno et in statu perfecto perveniant, propter systemam ordinationis automatam nostram et severam qualitatis inspectionem. Supportemus etiam distributionem usque ad domum. Post-Mercaturae Servitium: Postquam recepistis merces, societas nostra non finitur. Servitia post-venditionis ampla nostra comprehendunt supportem installationis, doctrinam usoris et conservationem. Departamentum servitii clientium semper paratum est ad resolutionem omnium quaestionum vel sollicitudinum vestrarum, ut satisfactio vestra completa sit. Postquam emistis instrumenta ab LSJ, triennium warrantii praebemus, ut servitia post-venditionis certa a nobis accipere possitis. Electio LSJ est fiducia, qualitate et supporte incomparabili eligere. Exspectamus esse socii vestri in quaerendo et salvando urbanis, necnon apud milites ignium. Ex anno 2013, LSJ manufacturam, productionem et distributionem instrumentorum ad altam performance pro quaestionibus investigationis et salutis, necnon pro pompae ignium, elaboravit. LSJ certificationes ISO9001, CE et dispositivorum ad explosionem detegendam accepit. Praeterea, plus quam triginta patentia possidet. Quaestu principali utimur, itaque magnopere in departmentum designi et investigandi investimus. LSJ participavit in quattuor maximis eventibus anno 2024: INTERSEC, Securika, 18th Defence Services Asia et 3rd National Security Asia in Malaisia et NFPA in USA. Item, INTERSEC in Dubaio a die 14 usque ad diem 16 mensis Ianuarii anno 2025 registravimus. Ostendemus radar vitam detectorium, radar tridimensionale per muros videndum, detector gaziorum, instrumenta auditus et visionis, praeterea instrumenta ad stabilitatem monitandam et thermas camaras ad incendia opprimenda. Te hortamur ut ad standum nostrum venias. Plus quam undecim annos experientiae in manufactura LSJ habet. Specialiter in designanda et construenda producta innovativa ex usu clientium scenario pugnat. Item, characteristicas meliores et costus minores pro productis semper quaerit. LSJ etiam amplam experientiam in campo quaestionis urbanae et salutis habet. Exempli gratia, in terraemotu Turciae anno 2023, radio vita detectorium LSJ fuit elementum clavarium in conatibus salutis Equipae Caerulei Caeli Sinensis.elige LSJ pro solutionibus progressivis et fidelibus ad tua necessaria accommodatis. Supportum praebemus departmentis Ignis et Profectionis, praeterquam Publicae Salutis servitibus et urbani scrutandi et profugiendi turmis. LSJ innovativa instrumenta praebet ad explosiva deprehendenda, scrutanda et profugienda, et in periculosis locis operanda inter varias industrias. Camarae Thermicae Exstinguendorum: Studuimus et duos generis camarae thermicae elaboravimus. Tres optiones resolutionis continent: 256x192, 384x288 et 640x512. Haec camarae usque ad 2000 gradus Celsius temperaturas metiunt. Instrumenta Scrutandi et Profugiendi: Producta varia praebemus, quae includunt stabilizatores, detector gas et systemata motus monitorantia. Camarae Thermicae Industrialis: Praeterquam camarae thermicae pro exstinguendis ignibus, LSJ camarae thermicae manu tenendas offert ad detectionem fugae aquae et inspectionem aedificiorum, necnon electronicam reparationem, subterram calefactionem amittentem et inspectionem systematum HVAC. Scopuli Thermici et Nocturni Visionis Scopuli optime apti sunt ad visionem nocturnam noctu et apud venatores popularis sunt. Possum ponere super arcus. LSJ devotus est praebendo instrumentis thermicis et profugiendi altae qualitatis ut opes varias industrias satisfaciat, incremento salutis et efficientiae. LSJ solida et progressiva solutiones offert. Fide dignus es LSJ ut primarius socius tuus in campo urbis scrutandi et profugiendi. Copyright © Beijing LSJ Technology Development Co., Ltd. Omnia Jura Servata
-
Politia Privati
Dispositiva detectionis explosionum
Technologia Posterior Dispositivos de Detectione Explosionum
Augmentum Securitatis cum Dispositivis de Detectione Explosionum
Quomodo Dispositiva Detectionis Explosionum Nos Custodiunt
Exploratio Impactus Dispositivarum Detectionis Explosionum super Systema Securitatis
Why choose LSJ Technology Dispositiva detectionis explosionum?
Qualitatem et Punctualitatem Consecutionis Tutamen: LSJ's Devotio ad Placitum Clientium
Cur LSJ Potest Esse Tuus Fabricator et Suppeditator Primatorum?
Innovando Fabricam Tectumentorum Prope Quaestionem Et Salutem Cum Alta Efficiencia
Supplēs Catēnās Ōmnibus Instrumentīs ad Servandōs et Recuperandōs in Urbānā Rēgīōne
Categories Producti Relatae
Non invenis quod quaeris?
Petere Citatio Nunc
Consulere nostros pro magis productis disponibilibus.Cum Nobis Contacata